@adaptivestone/framework 4.4.0 → 4.6.0
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 +10 -0
- package/controllers/Auth.test.js +2 -0
- package/controllers/Home.test.js +2 -0
- package/controllers/index.js +20 -17
- package/coverage/base.css +224 -0
- package/coverage/block-navigation.js +87 -0
- package/coverage/clover.xml +3433 -0
- package/coverage/coverage-final.json +41 -0
- package/coverage/favicon.png +0 -0
- package/coverage/framework/config/auth.js.html +100 -0
- package/coverage/framework/config/http.js.html +112 -0
- package/coverage/framework/config/i18n.js.html +121 -0
- package/coverage/framework/config/index.html +236 -0
- package/coverage/framework/config/log.js.html +151 -0
- package/coverage/framework/config/mail.js.html +172 -0
- package/coverage/framework/config/mongo.js.html +94 -0
- package/coverage/framework/config/rateLimiter.js.html +133 -0
- package/coverage/framework/config/redis.js.html +97 -0
- package/coverage/framework/config/validate.js.html +94 -0
- package/coverage/framework/controllers/Auth.js.html +721 -0
- package/coverage/framework/controllers/Home.js.html +169 -0
- package/coverage/framework/controllers/index.html +146 -0
- package/coverage/framework/controllers/index.js.html +268 -0
- package/coverage/framework/controllers/test/SomeController.js.html +616 -0
- package/coverage/framework/controllers/test/index.html +116 -0
- package/coverage/framework/helpers/redis/clearNamespace.js.html +127 -0
- package/coverage/framework/helpers/redis/index.html +116 -0
- package/coverage/framework/index.html +116 -0
- package/coverage/framework/models/Sequence.js.html +151 -0
- package/coverage/framework/models/User.js.html +859 -0
- package/coverage/framework/models/index.html +131 -0
- package/coverage/framework/modules/AbstractController.js.html +1315 -0
- package/coverage/framework/modules/AbstractModel.js.html +268 -0
- package/coverage/framework/modules/Base.js.html +577 -0
- package/coverage/framework/modules/index.html +146 -0
- package/coverage/framework/server.js.html +820 -0
- package/coverage/framework/services/cache/Cache.js.html +430 -0
- package/coverage/framework/services/cache/index.html +116 -0
- package/coverage/framework/services/documentation/DocumentationGenerator.js.html +598 -0
- package/coverage/framework/services/documentation/index.html +116 -0
- package/coverage/framework/services/http/HttpServer.js.html +373 -0
- package/coverage/framework/services/http/index.html +116 -0
- package/coverage/framework/services/http/middleware/AbstractMiddleware.js.html +238 -0
- package/coverage/framework/services/http/middleware/Auth.js.html +145 -0
- package/coverage/framework/services/http/middleware/GetUserByToken.js.html +223 -0
- package/coverage/framework/services/http/middleware/I18n.js.html +442 -0
- package/coverage/framework/services/http/middleware/Pagination.js.html +253 -0
- package/coverage/framework/services/http/middleware/PrepareAppInfo.js.html +139 -0
- package/coverage/framework/services/http/middleware/RateLimiter.js.html +472 -0
- package/coverage/framework/services/http/middleware/RequestLogger.js.html +151 -0
- package/coverage/framework/services/http/middleware/RequestParser.js.html +199 -0
- package/coverage/framework/services/http/middleware/Role.js.html +172 -0
- package/coverage/framework/services/http/middleware/index.html +251 -0
- package/coverage/framework/services/http/middleware/test/CheckFlag.js.html +139 -0
- package/coverage/framework/services/http/middleware/test/index.html +116 -0
- package/coverage/framework/services/messaging/email/index.html +116 -0
- package/coverage/framework/services/messaging/email/index.js.html +739 -0
- package/coverage/framework/services/messaging/index.html +116 -0
- package/coverage/framework/services/messaging/index.js.html +100 -0
- package/coverage/framework/services/validate/ValidateService.js.html +568 -0
- package/coverage/framework/services/validate/drivers/AbstractValidator.js.html +196 -0
- package/coverage/framework/services/validate/drivers/CustomValidator.js.html +241 -0
- package/coverage/framework/services/validate/drivers/YupValidator.js.html +394 -0
- package/coverage/framework/services/validate/drivers/index.html +146 -0
- package/coverage/framework/services/validate/index.html +116 -0
- package/coverage/index.html +341 -0
- package/coverage/prettify.css +1 -0
- package/coverage/prettify.js +2 -0
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +196 -0
- package/models/Sequence.test.js +2 -0
- package/models/User.js +8 -8
- package/models/User.test.js +2 -0
- package/modules/AbstractModel.js +1 -0
- package/modules/BaseCli.js +2 -2
- package/modules/Modules.test.js +3 -2
- package/package.json +7 -18
- package/server.js +9 -9
- package/services/http/middleware/I18n.test.js +12 -5
- package/services/http/middleware/PrepareAppInfo.test.js +7 -3
- package/services/http/middleware/RateLimiter.js +5 -6
- package/services/http/middleware/RateLimiter.test.js +184 -1
- package/services/http/middleware/RequestParser.test.js +7 -4
- package/services/validate/ValidateService.test.js +2 -0
- package/tests/setup.js +2 -2
- package/tests/setupVitest.js +119 -0
- package/vitest.config.js +9 -0
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
/* eslint-disable */
|
|
2
|
+
var addSorting = (function() {
|
|
3
|
+
'use strict';
|
|
4
|
+
var cols,
|
|
5
|
+
currentSort = {
|
|
6
|
+
index: 0,
|
|
7
|
+
desc: false
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
// returns the summary table element
|
|
11
|
+
function getTable() {
|
|
12
|
+
return document.querySelector('.coverage-summary');
|
|
13
|
+
}
|
|
14
|
+
// returns the thead element of the summary table
|
|
15
|
+
function getTableHeader() {
|
|
16
|
+
return getTable().querySelector('thead tr');
|
|
17
|
+
}
|
|
18
|
+
// returns the tbody element of the summary table
|
|
19
|
+
function getTableBody() {
|
|
20
|
+
return getTable().querySelector('tbody');
|
|
21
|
+
}
|
|
22
|
+
// returns the th element for nth column
|
|
23
|
+
function getNthColumn(n) {
|
|
24
|
+
return getTableHeader().querySelectorAll('th')[n];
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function onFilterInput() {
|
|
28
|
+
const searchValue = document.getElementById('fileSearch').value;
|
|
29
|
+
const rows = document.getElementsByTagName('tbody')[0].children;
|
|
30
|
+
for (let i = 0; i < rows.length; i++) {
|
|
31
|
+
const row = rows[i];
|
|
32
|
+
if (
|
|
33
|
+
row.textContent
|
|
34
|
+
.toLowerCase()
|
|
35
|
+
.includes(searchValue.toLowerCase())
|
|
36
|
+
) {
|
|
37
|
+
row.style.display = '';
|
|
38
|
+
} else {
|
|
39
|
+
row.style.display = 'none';
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// loads the search box
|
|
45
|
+
function addSearchBox() {
|
|
46
|
+
var template = document.getElementById('filterTemplate');
|
|
47
|
+
var templateClone = template.content.cloneNode(true);
|
|
48
|
+
templateClone.getElementById('fileSearch').oninput = onFilterInput;
|
|
49
|
+
template.parentElement.appendChild(templateClone);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// loads all columns
|
|
53
|
+
function loadColumns() {
|
|
54
|
+
var colNodes = getTableHeader().querySelectorAll('th'),
|
|
55
|
+
colNode,
|
|
56
|
+
cols = [],
|
|
57
|
+
col,
|
|
58
|
+
i;
|
|
59
|
+
|
|
60
|
+
for (i = 0; i < colNodes.length; i += 1) {
|
|
61
|
+
colNode = colNodes[i];
|
|
62
|
+
col = {
|
|
63
|
+
key: colNode.getAttribute('data-col'),
|
|
64
|
+
sortable: !colNode.getAttribute('data-nosort'),
|
|
65
|
+
type: colNode.getAttribute('data-type') || 'string'
|
|
66
|
+
};
|
|
67
|
+
cols.push(col);
|
|
68
|
+
if (col.sortable) {
|
|
69
|
+
col.defaultDescSort = col.type === 'number';
|
|
70
|
+
colNode.innerHTML =
|
|
71
|
+
colNode.innerHTML + '<span class="sorter"></span>';
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return cols;
|
|
75
|
+
}
|
|
76
|
+
// attaches a data attribute to every tr element with an object
|
|
77
|
+
// of data values keyed by column name
|
|
78
|
+
function loadRowData(tableRow) {
|
|
79
|
+
var tableCols = tableRow.querySelectorAll('td'),
|
|
80
|
+
colNode,
|
|
81
|
+
col,
|
|
82
|
+
data = {},
|
|
83
|
+
i,
|
|
84
|
+
val;
|
|
85
|
+
for (i = 0; i < tableCols.length; i += 1) {
|
|
86
|
+
colNode = tableCols[i];
|
|
87
|
+
col = cols[i];
|
|
88
|
+
val = colNode.getAttribute('data-value');
|
|
89
|
+
if (col.type === 'number') {
|
|
90
|
+
val = Number(val);
|
|
91
|
+
}
|
|
92
|
+
data[col.key] = val;
|
|
93
|
+
}
|
|
94
|
+
return data;
|
|
95
|
+
}
|
|
96
|
+
// loads all row data
|
|
97
|
+
function loadData() {
|
|
98
|
+
var rows = getTableBody().querySelectorAll('tr'),
|
|
99
|
+
i;
|
|
100
|
+
|
|
101
|
+
for (i = 0; i < rows.length; i += 1) {
|
|
102
|
+
rows[i].data = loadRowData(rows[i]);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
// sorts the table using the data for the ith column
|
|
106
|
+
function sortByIndex(index, desc) {
|
|
107
|
+
var key = cols[index].key,
|
|
108
|
+
sorter = function(a, b) {
|
|
109
|
+
a = a.data[key];
|
|
110
|
+
b = b.data[key];
|
|
111
|
+
return a < b ? -1 : a > b ? 1 : 0;
|
|
112
|
+
},
|
|
113
|
+
finalSorter = sorter,
|
|
114
|
+
tableBody = document.querySelector('.coverage-summary tbody'),
|
|
115
|
+
rowNodes = tableBody.querySelectorAll('tr'),
|
|
116
|
+
rows = [],
|
|
117
|
+
i;
|
|
118
|
+
|
|
119
|
+
if (desc) {
|
|
120
|
+
finalSorter = function(a, b) {
|
|
121
|
+
return -1 * sorter(a, b);
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
for (i = 0; i < rowNodes.length; i += 1) {
|
|
126
|
+
rows.push(rowNodes[i]);
|
|
127
|
+
tableBody.removeChild(rowNodes[i]);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
rows.sort(finalSorter);
|
|
131
|
+
|
|
132
|
+
for (i = 0; i < rows.length; i += 1) {
|
|
133
|
+
tableBody.appendChild(rows[i]);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
// removes sort indicators for current column being sorted
|
|
137
|
+
function removeSortIndicators() {
|
|
138
|
+
var col = getNthColumn(currentSort.index),
|
|
139
|
+
cls = col.className;
|
|
140
|
+
|
|
141
|
+
cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, '');
|
|
142
|
+
col.className = cls;
|
|
143
|
+
}
|
|
144
|
+
// adds sort indicators for current column being sorted
|
|
145
|
+
function addSortIndicators() {
|
|
146
|
+
getNthColumn(currentSort.index).className += currentSort.desc
|
|
147
|
+
? ' sorted-desc'
|
|
148
|
+
: ' sorted';
|
|
149
|
+
}
|
|
150
|
+
// adds event listeners for all sorter widgets
|
|
151
|
+
function enableUI() {
|
|
152
|
+
var i,
|
|
153
|
+
el,
|
|
154
|
+
ithSorter = function ithSorter(i) {
|
|
155
|
+
var col = cols[i];
|
|
156
|
+
|
|
157
|
+
return function() {
|
|
158
|
+
var desc = col.defaultDescSort;
|
|
159
|
+
|
|
160
|
+
if (currentSort.index === i) {
|
|
161
|
+
desc = !currentSort.desc;
|
|
162
|
+
}
|
|
163
|
+
sortByIndex(i, desc);
|
|
164
|
+
removeSortIndicators();
|
|
165
|
+
currentSort.index = i;
|
|
166
|
+
currentSort.desc = desc;
|
|
167
|
+
addSortIndicators();
|
|
168
|
+
};
|
|
169
|
+
};
|
|
170
|
+
for (i = 0; i < cols.length; i += 1) {
|
|
171
|
+
if (cols[i].sortable) {
|
|
172
|
+
// add the click event handler on the th so users
|
|
173
|
+
// dont have to click on those tiny arrows
|
|
174
|
+
el = getNthColumn(i).querySelector('.sorter').parentElement;
|
|
175
|
+
if (el.addEventListener) {
|
|
176
|
+
el.addEventListener('click', ithSorter(i));
|
|
177
|
+
} else {
|
|
178
|
+
el.attachEvent('onclick', ithSorter(i));
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
// adds sorting functionality to the UI
|
|
184
|
+
return function() {
|
|
185
|
+
if (!getTable()) {
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
cols = loadColumns();
|
|
189
|
+
loadData();
|
|
190
|
+
addSearchBox();
|
|
191
|
+
addSortIndicators();
|
|
192
|
+
enableUI();
|
|
193
|
+
};
|
|
194
|
+
})();
|
|
195
|
+
|
|
196
|
+
window.addEventListener('load', addSorting);
|
package/models/Sequence.test.js
CHANGED
package/models/User.js
CHANGED
|
@@ -88,8 +88,8 @@ class User extends AbstractModel {
|
|
|
88
88
|
const scryptAsync = promisify(scrypt);
|
|
89
89
|
const data = await scryptAsync(
|
|
90
90
|
this.email + Date.now(),
|
|
91
|
-
this.
|
|
92
|
-
this.
|
|
91
|
+
this.getSuper().saltSecret,
|
|
92
|
+
this.getSuper().hashRounds,
|
|
93
93
|
);
|
|
94
94
|
const token = data.toString('base64url');
|
|
95
95
|
this.sessionTokens.push({ token, valid: timestamp });
|
|
@@ -138,8 +138,8 @@ class User extends AbstractModel {
|
|
|
138
138
|
const scryptAsync = promisify(scrypt);
|
|
139
139
|
const data = await scryptAsync(
|
|
140
140
|
userMongoose.email + Date.now(),
|
|
141
|
-
userMongoose.
|
|
142
|
-
userMongoose.
|
|
141
|
+
userMongoose.getSuper().saltSecret,
|
|
142
|
+
userMongoose.getSuper().hashRounds,
|
|
143
143
|
);
|
|
144
144
|
const token = data.toString('base64url');
|
|
145
145
|
// if (err) {
|
|
@@ -177,7 +177,7 @@ class User extends AbstractModel {
|
|
|
177
177
|
const passwordRecoveryToken =
|
|
178
178
|
await User.generateUserPasswordRecoveryToken(this);
|
|
179
179
|
const mail = new Mailer(
|
|
180
|
-
this.
|
|
180
|
+
this.getSuper().app,
|
|
181
181
|
'recovery',
|
|
182
182
|
{
|
|
183
183
|
link: `${i18n.language}/auth/recovery?password_recovery_token=${passwordRecoveryToken.token}`,
|
|
@@ -194,8 +194,8 @@ class User extends AbstractModel {
|
|
|
194
194
|
const scryptAsync = promisify(scrypt);
|
|
195
195
|
const data = await scryptAsync(
|
|
196
196
|
userMongoose.email + Date.now(),
|
|
197
|
-
userMongoose.
|
|
198
|
-
userMongoose.
|
|
197
|
+
userMongoose.getSuper().saltSecret,
|
|
198
|
+
userMongoose.getSuper().hashRounds,
|
|
199
199
|
);
|
|
200
200
|
const token = data.toString('base64url');
|
|
201
201
|
// if (err) {
|
|
@@ -243,7 +243,7 @@ class User extends AbstractModel {
|
|
|
243
243
|
async sendVerificationEmail(i18n) {
|
|
244
244
|
const verificationToken = await User.generateUserVerificationToken(this);
|
|
245
245
|
const mail = new Mailer(
|
|
246
|
-
this.
|
|
246
|
+
this.getSuper().app,
|
|
247
247
|
'verification',
|
|
248
248
|
{
|
|
249
249
|
link: `${i18n.language}/auth/login?verification_token=${verificationToken.token}`,
|
package/models/User.test.js
CHANGED
package/modules/AbstractModel.js
CHANGED
|
@@ -14,6 +14,7 @@ class AbstractModel extends Base {
|
|
|
14
14
|
this.mongooseSchema.set('minimize', false);
|
|
15
15
|
this.mongooseSchema.loadClass(this.constructor);
|
|
16
16
|
this.mongooseSchema.statics.getSuper = () => this;
|
|
17
|
+
this.mongooseSchema.methods.getSuper = () => this;
|
|
17
18
|
this.initHooks();
|
|
18
19
|
this.mongooseModel = mongoose.model(
|
|
19
20
|
this.constructor.name,
|
package/modules/BaseCli.js
CHANGED
|
@@ -48,10 +48,10 @@ class Cli extends Base {
|
|
|
48
48
|
return false;
|
|
49
49
|
}
|
|
50
50
|
// TODO wait until https://github.com/nodejs/node/issues/35889
|
|
51
|
-
|
|
51
|
+
const { default: Command } = await import(this.commands[command]);
|
|
52
52
|
|
|
53
53
|
// eslint-disable-next-line import/no-dynamic-require, global-require
|
|
54
|
-
const Command = require(this.commands[command]);
|
|
54
|
+
// const Command = require(this.commands[command]);
|
|
55
55
|
|
|
56
56
|
const c = new Command(this.app, this.commands, args);
|
|
57
57
|
let result = false;
|
package/modules/Modules.test.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import SomeController from '../controllers/test/SomeController';
|
|
3
|
+
import AbstractController from './AbstractController';
|
|
3
4
|
|
|
4
5
|
describe('abstract controller methods', () => {
|
|
5
6
|
it('can get routes', async () => {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@adaptivestone/framework",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.6.0",
|
|
4
4
|
"description": "Adaptive stone node js framework",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"engines": {
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
"scripts": {
|
|
15
15
|
"dev": "nodemon ./index.js",
|
|
16
16
|
"prod": "nodemon ./cluster.js",
|
|
17
|
-
"test": "
|
|
17
|
+
"test": "vitest run --coverage",
|
|
18
18
|
"prettier": "prettier --check '**/*.(js|jsx|ts|tsx|json|css|scss|md)'",
|
|
19
19
|
"lint": "eslint '**/*.js'",
|
|
20
20
|
"lint:fix": "eslint '**/*.js' --fix",
|
|
@@ -25,18 +25,6 @@
|
|
|
25
25
|
"benchmark2": "h2load -n 10000 -c 50 https://localhost:3300/",
|
|
26
26
|
"redis:docker": "docker run --rm -p 6379:6379 redis"
|
|
27
27
|
},
|
|
28
|
-
"jest": {
|
|
29
|
-
"setupFilesAfterEnv": [
|
|
30
|
-
"./tests/setup.js"
|
|
31
|
-
],
|
|
32
|
-
"testEnvironment": "node",
|
|
33
|
-
"verbose": true,
|
|
34
|
-
"collectCoverage": true,
|
|
35
|
-
"coverageReporters": [
|
|
36
|
-
"text",
|
|
37
|
-
"text-summary"
|
|
38
|
-
]
|
|
39
|
-
},
|
|
40
28
|
"author": "Andrey Logunov",
|
|
41
29
|
"license": "MIT",
|
|
42
30
|
"dependencies": {
|
|
@@ -56,23 +44,24 @@
|
|
|
56
44
|
"nodemailer-sendmail-transport": "^1.0.2",
|
|
57
45
|
"nodemailer-stub-transport": "^1.1.0",
|
|
58
46
|
"pug": "^3.0.2",
|
|
59
|
-
"rate-limiter-flexible": "^
|
|
47
|
+
"rate-limiter-flexible": "^3.0.0",
|
|
60
48
|
"redis": "^4.3.1",
|
|
61
49
|
"winston": "^3.3.3",
|
|
62
50
|
"winston-transport-sentry-node": "^2.0.0",
|
|
63
51
|
"yup": "^1.0.0"
|
|
64
52
|
},
|
|
65
53
|
"devDependencies": {
|
|
54
|
+
"@vitest/coverage-v8": "^0.34.3",
|
|
66
55
|
"eslint": "^8.0.0",
|
|
67
56
|
"eslint-config-airbnb-base": "^15.0.0",
|
|
68
57
|
"eslint-config-prettier": "^9.0.0",
|
|
69
|
-
"eslint-plugin-
|
|
58
|
+
"eslint-plugin-vitest": "^0.3.1",
|
|
70
59
|
"husky": "^8.0.0",
|
|
71
|
-
"jest": "^29.0.0",
|
|
72
60
|
"lint-staged": "^14.0.0",
|
|
73
61
|
"mongodb-memory-server": "^8.0.2",
|
|
74
62
|
"nodemon": "^3.0.1",
|
|
75
|
-
"prettier": "^3.0.0"
|
|
63
|
+
"prettier": "^3.0.0",
|
|
64
|
+
"vitest": "^0.34.3"
|
|
76
65
|
},
|
|
77
66
|
"lint-staged": {
|
|
78
67
|
"**/*.{js,jsx,ts,tsx,json,css,scss,md}": [
|
package/server.js
CHANGED
|
@@ -52,17 +52,17 @@ class Server {
|
|
|
52
52
|
*/
|
|
53
53
|
async startServer(callbackBefore404 = async () => Promise.resolve()) {
|
|
54
54
|
// eslint-disable-next-line global-require
|
|
55
|
-
const HttpServer = require('./services/http/HttpServer');
|
|
55
|
+
// const HttpServer = require('./services/http/HttpServer');
|
|
56
56
|
// eslint-disable-next-line global-require
|
|
57
|
-
const ControllerManager = require('./controllers/index');
|
|
57
|
+
// const ControllerManager = require('./controllers/index');
|
|
58
58
|
// TODO wait until https://github.com/nodejs/node/issues/35889
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
59
|
+
const [{ default: HttpServer }, { default: ControllerManager }] =
|
|
60
|
+
await Promise.all([
|
|
61
|
+
// eslint-disable-next-line import/extensions
|
|
62
|
+
import('./services/http/HttpServer.js'), // Speed optimisation
|
|
63
|
+
// eslint-disable-next-line import/extensions
|
|
64
|
+
import('./controllers/index.js'), // Speed optimisation
|
|
65
|
+
]);
|
|
66
66
|
|
|
67
67
|
this.addErrorHandling();
|
|
68
68
|
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
|
|
1
|
+
import { beforeAll, describe, it, expect } from 'vitest';
|
|
2
|
+
import I18n from './I18n';
|
|
2
3
|
|
|
3
4
|
describe('i18n middleware methods', () => {
|
|
4
5
|
let middleware;
|
|
@@ -45,13 +46,16 @@ describe('i18n middleware methods', () => {
|
|
|
45
46
|
|
|
46
47
|
it('middleware that works', async () => {
|
|
47
48
|
expect.assertions(4);
|
|
48
|
-
|
|
49
|
+
let isCalled = false;
|
|
50
|
+
const nextFunction = () => {
|
|
51
|
+
isCalled = true;
|
|
52
|
+
};
|
|
49
53
|
const req = {
|
|
50
54
|
get: () => 'en',
|
|
51
55
|
appInfo: {},
|
|
52
56
|
};
|
|
53
57
|
await middleware.middleware(req, {}, nextFunction);
|
|
54
|
-
expect(
|
|
58
|
+
expect(isCalled).toBe(true);
|
|
55
59
|
expect(req.appInfo.i18n).toBeDefined();
|
|
56
60
|
expect(req.appInfo.i18n.t('aaaaa')).toBe('aaaaa');
|
|
57
61
|
expect(req.i18n.t('aaaaa')).toBe('aaaaa'); // proxy test
|
|
@@ -62,13 +66,16 @@ describe('i18n middleware methods', () => {
|
|
|
62
66
|
global.server.app.updateConfig('i18n', { enabled: false });
|
|
63
67
|
middleware = new I18n(global.server.app);
|
|
64
68
|
|
|
65
|
-
|
|
69
|
+
let isCalled = false;
|
|
70
|
+
const nextFunction = () => {
|
|
71
|
+
isCalled = true;
|
|
72
|
+
};
|
|
66
73
|
const req = {
|
|
67
74
|
get: () => 'en',
|
|
68
75
|
appInfo: {},
|
|
69
76
|
};
|
|
70
77
|
await middleware.middleware(req, {}, nextFunction);
|
|
71
|
-
expect(
|
|
78
|
+
expect(isCalled).toBe(true);
|
|
72
79
|
expect(req.appInfo.i18n).toBeDefined();
|
|
73
80
|
expect(req.appInfo.i18n.t('aaaaa')).toBe('aaaaa');
|
|
74
81
|
expect(req.i18n.t('aaaaa')).toBe('aaaaa'); // proxy test
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import PrepareAppInfo from './PrepareAppInfo';
|
|
2
3
|
|
|
3
4
|
describe('prepareAppInfo methods', () => {
|
|
4
5
|
it('have description fields', async () => {
|
|
@@ -10,10 +11,13 @@ describe('prepareAppInfo methods', () => {
|
|
|
10
11
|
it('middleware that works', async () => {
|
|
11
12
|
expect.assertions(3);
|
|
12
13
|
const middleware = new PrepareAppInfo(global.server.app);
|
|
13
|
-
|
|
14
|
+
let isCalled = false;
|
|
15
|
+
const nextFunction = () => {
|
|
16
|
+
isCalled = true;
|
|
17
|
+
};
|
|
14
18
|
const req = {};
|
|
15
19
|
await middleware.middleware(req, {}, nextFunction);
|
|
16
|
-
expect(
|
|
20
|
+
expect(isCalled).toBe(true);
|
|
17
21
|
expect(req.appInfo).toBeDefined();
|
|
18
22
|
req.appInfo.test = 5;
|
|
19
23
|
await middleware.middleware(req, {}, nextFunction);
|
|
@@ -16,10 +16,9 @@ class RateLimiter extends AbstractMiddleware {
|
|
|
16
16
|
|
|
17
17
|
constructor(app, params) {
|
|
18
18
|
super(app, params);
|
|
19
|
-
const routeParams = params;
|
|
20
19
|
const limiterOptions = this.app.getConfig('rateLimiter');
|
|
21
20
|
|
|
22
|
-
this.finalOptions = merge(limiterOptions,
|
|
21
|
+
this.finalOptions = merge(limiterOptions, params);
|
|
23
22
|
this.limiter = null;
|
|
24
23
|
|
|
25
24
|
switch (this.finalOptions.driver) {
|
|
@@ -32,7 +31,7 @@ class RateLimiter extends AbstractMiddleware {
|
|
|
32
31
|
break;
|
|
33
32
|
|
|
34
33
|
case 'mongo':
|
|
35
|
-
this.limiter = RateLimiterMongo({
|
|
34
|
+
this.limiter = new RateLimiterMongo({
|
|
36
35
|
storeClient: mongoose.connection,
|
|
37
36
|
...this.finalOptions.limiterOptions,
|
|
38
37
|
});
|
|
@@ -50,7 +49,6 @@ class RateLimiter extends AbstractMiddleware {
|
|
|
50
49
|
const redisConfig = this.app.getConfig('redis');
|
|
51
50
|
const redisClient = redis.createClient({
|
|
52
51
|
url: redisConfig.url,
|
|
53
|
-
legacyMode: true,
|
|
54
52
|
});
|
|
55
53
|
|
|
56
54
|
// TODO: change it
|
|
@@ -71,6 +69,7 @@ class RateLimiter extends AbstractMiddleware {
|
|
|
71
69
|
|
|
72
70
|
return new RateLimiterRedis({
|
|
73
71
|
storeClient: redisClient,
|
|
72
|
+
useRedisPackage: true,
|
|
74
73
|
...this.finalOptions.limiterOptions,
|
|
75
74
|
});
|
|
76
75
|
}
|
|
@@ -91,7 +90,7 @@ class RateLimiter extends AbstractMiddleware {
|
|
|
91
90
|
|
|
92
91
|
if (request && request.length) {
|
|
93
92
|
request.forEach((val) => {
|
|
94
|
-
if (req.body[val]) {
|
|
93
|
+
if (req.body && req.body[val]) {
|
|
95
94
|
key.push(req.body[val]);
|
|
96
95
|
}
|
|
97
96
|
// if (req.appInfo.request && req.appInfo.request[val]) {
|
|
@@ -108,6 +107,7 @@ class RateLimiter extends AbstractMiddleware {
|
|
|
108
107
|
this.logger.info(
|
|
109
108
|
`RateLimmiter not inited correclty! Please check init logs `,
|
|
110
109
|
);
|
|
110
|
+
return res.status(500).send('');
|
|
111
111
|
}
|
|
112
112
|
|
|
113
113
|
const { namespace } = this.app.getConfig('redis');
|
|
@@ -119,7 +119,6 @@ class RateLimiter extends AbstractMiddleware {
|
|
|
119
119
|
.catch(() => {
|
|
120
120
|
this.logger.warn(`Too many requests. Consume key: ${consumeKey}`);
|
|
121
121
|
});
|
|
122
|
-
|
|
123
122
|
if (consumeResult) {
|
|
124
123
|
return next();
|
|
125
124
|
}
|