@adaptivestone/framework 4.8.3 → 4.9.1

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.
Files changed (80) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/package.json +2 -2
  3. package/services/http/HttpServer.js +1 -1
  4. package/services/http/middleware/RateLimiter.js +3 -3
  5. package/services/http/middleware/RateLimiter.test.js +2 -2
  6. package/services/http/middleware/Role.js +1 -1
  7. package/services/http/middleware/Role.test.js +1 -1
  8. package/tests/globalSetupVitest.js +35 -0
  9. package/tests/setupVitest.js +7 -17
  10. package/vitest.config.js +7 -0
  11. package/coverage/base.css +0 -224
  12. package/coverage/block-navigation.js +0 -87
  13. package/coverage/clover.xml +0 -3573
  14. package/coverage/coverage-final.json +0 -44
  15. package/coverage/favicon.png +0 -0
  16. package/coverage/framework/config/auth.js.html +0 -100
  17. package/coverage/framework/config/http.js.html +0 -112
  18. package/coverage/framework/config/i18n.js.html +0 -121
  19. package/coverage/framework/config/index.html +0 -236
  20. package/coverage/framework/config/log.js.html +0 -151
  21. package/coverage/framework/config/mail.js.html +0 -172
  22. package/coverage/framework/config/mongo.js.html +0 -94
  23. package/coverage/framework/config/rateLimiter.js.html +0 -133
  24. package/coverage/framework/config/redis.js.html +0 -97
  25. package/coverage/framework/config/validate.js.html +0 -94
  26. package/coverage/framework/controllers/Auth.js.html +0 -715
  27. package/coverage/framework/controllers/Home.js.html +0 -169
  28. package/coverage/framework/controllers/index.html +0 -146
  29. package/coverage/framework/controllers/index.js.html +0 -259
  30. package/coverage/framework/controllers/test/SomeController.js.html +0 -571
  31. package/coverage/framework/controllers/test/index.html +0 -116
  32. package/coverage/framework/helpers/files.js.html +0 -310
  33. package/coverage/framework/helpers/index.html +0 -131
  34. package/coverage/framework/helpers/logger.js.html +0 -142
  35. package/coverage/framework/helpers/redis/clearNamespace.js.html +0 -127
  36. package/coverage/framework/helpers/redis/index.html +0 -116
  37. package/coverage/framework/index.html +0 -116
  38. package/coverage/framework/models/Migration.js.html +0 -130
  39. package/coverage/framework/models/Sequence.js.html +0 -151
  40. package/coverage/framework/models/User.js.html +0 -859
  41. package/coverage/framework/models/index.html +0 -146
  42. package/coverage/framework/modules/AbstractController.js.html +0 -1309
  43. package/coverage/framework/modules/AbstractModel.js.html +0 -268
  44. package/coverage/framework/modules/Base.js.html +0 -244
  45. package/coverage/framework/modules/index.html +0 -146
  46. package/coverage/framework/server.js.html +0 -1279
  47. package/coverage/framework/services/cache/Cache.js.html +0 -445
  48. package/coverage/framework/services/cache/index.html +0 -116
  49. package/coverage/framework/services/documentation/DocumentationGenerator.js.html +0 -592
  50. package/coverage/framework/services/documentation/index.html +0 -116
  51. package/coverage/framework/services/http/HttpServer.js.html +0 -373
  52. package/coverage/framework/services/http/index.html +0 -116
  53. package/coverage/framework/services/http/middleware/AbstractMiddleware.js.html +0 -238
  54. package/coverage/framework/services/http/middleware/Auth.js.html +0 -145
  55. package/coverage/framework/services/http/middleware/GetUserByToken.js.html +0 -223
  56. package/coverage/framework/services/http/middleware/I18n.js.html +0 -442
  57. package/coverage/framework/services/http/middleware/Pagination.js.html +0 -253
  58. package/coverage/framework/services/http/middleware/PrepareAppInfo.js.html +0 -139
  59. package/coverage/framework/services/http/middleware/RateLimiter.js.html +0 -472
  60. package/coverage/framework/services/http/middleware/RequestLogger.js.html +0 -151
  61. package/coverage/framework/services/http/middleware/RequestParser.js.html +0 -199
  62. package/coverage/framework/services/http/middleware/Role.js.html +0 -172
  63. package/coverage/framework/services/http/middleware/index.html +0 -251
  64. package/coverage/framework/services/http/middleware/test/CheckFlag.js.html +0 -139
  65. package/coverage/framework/services/http/middleware/test/index.html +0 -116
  66. package/coverage/framework/services/messaging/email/index.html +0 -116
  67. package/coverage/framework/services/messaging/email/index.js.html +0 -739
  68. package/coverage/framework/services/messaging/index.html +0 -116
  69. package/coverage/framework/services/messaging/index.js.html +0 -100
  70. package/coverage/framework/services/validate/ValidateService.js.html +0 -556
  71. package/coverage/framework/services/validate/drivers/AbstractValidator.js.html +0 -196
  72. package/coverage/framework/services/validate/drivers/CustomValidator.js.html +0 -241
  73. package/coverage/framework/services/validate/drivers/YupValidator.js.html +0 -394
  74. package/coverage/framework/services/validate/drivers/index.html +0 -146
  75. package/coverage/framework/services/validate/index.html +0 -116
  76. package/coverage/index.html +0 -356
  77. package/coverage/prettify.css +0 -1
  78. package/coverage/prettify.js +0 -2
  79. package/coverage/sort-arrow-sprite.png +0 -0
  80. package/coverage/sorter.js +0 -196
package/CHANGELOG.md CHANGED
@@ -1,3 +1,11 @@
1
+ ### 4.9.1
2
+
3
+ [UPDATE] all responces from framework now happens in JSON. Previouls sometime aswers was in plan text
4
+
5
+ ### 4.9.0
6
+
7
+ [BREAKING] We are separated testsing to setyp and global setup. Global setup now care of mongo to make sure that only on mongodb memoery server is spinned up. If you are using vitest please add "globalSetup: node_modules/@adaptivestone/framework/tests/globalSetupVitest" to your vitest config
8
+
1
9
  ### 4.8.3
2
10
 
3
11
  [UPDATE] Fix problme with fat start and closing connections after
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adaptivestone/framework",
3
- "version": "4.8.3",
3
+ "version": "4.9.1",
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": "vitest run --coverage",
17
+ "test": "vitest run",
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",
@@ -46,7 +46,7 @@ class HttpServer extends Base {
46
46
  // eslint-disable-next-line no-console
47
47
  console.error(err.stack);
48
48
  // TODO
49
- res.status(500).send('Something broke!');
49
+ res.status(500).json({ message: 'Something broke!' });
50
50
  });
51
51
 
52
52
  this.httpServer = http.Server(this.express);
@@ -105,9 +105,9 @@ class RateLimiter extends AbstractMiddleware {
105
105
  async middleware(req, res, next) {
106
106
  if (!this.limiter) {
107
107
  this.logger.info(
108
- `RateLimmiter not inited correclty! Please check init logs `,
108
+ `RateLimiter not inited correclty! Please check init logs `,
109
109
  );
110
- return res.status(500).send('');
110
+ return res.status(500).json({ message: 'RateLimiter error' });
111
111
  }
112
112
 
113
113
  const { namespace } = this.app.getConfig('redis');
@@ -122,7 +122,7 @@ class RateLimiter extends AbstractMiddleware {
122
122
  if (consumeResult) {
123
123
  return next();
124
124
  }
125
- return res.status(429).send('Too Many Requests');
125
+ return res.status(429).json({ message: 'Too Many Requests' });
126
126
  }
127
127
  }
128
128
 
@@ -106,7 +106,7 @@ describe('rate limiter methods', () => {
106
106
  status = statusCode;
107
107
  return this;
108
108
  },
109
- send() {
109
+ json() {
110
110
  isSend = true;
111
111
  },
112
112
  },
@@ -137,7 +137,7 @@ describe('rate limiter methods', () => {
137
137
  status = statusCode;
138
138
  return this;
139
139
  },
140
- send() {
140
+ json() {
141
141
  isSend = true;
142
142
  },
143
143
  },
@@ -9,7 +9,7 @@ class RoleMiddleware extends AbstractMiddleware {
9
9
  const { user } = req.appInfo;
10
10
 
11
11
  if (!user) {
12
- return res.status(401).send();
12
+ return res.status(401).json({ message: 'User should be provided' });
13
13
  }
14
14
 
15
15
  let hasRole = false;
@@ -48,7 +48,7 @@ describe('role middleware methods', () => {
48
48
  status = statusCode;
49
49
  return this;
50
50
  },
51
- send() {
51
+ json() {
52
52
  isSend = true;
53
53
  },
54
54
  },
@@ -0,0 +1,35 @@
1
+ const { MongoMemoryReplSet } = require('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 };
@@ -1,28 +1,18 @@
1
1
  import path from 'node:path';
2
+ import crypto from 'node:crypto';
2
3
  import { beforeAll, beforeEach, afterEach, afterAll } from 'vitest';
3
4
 
4
- const { MongoMemoryReplSet } = require('mongodb-memory-server');
5
-
6
5
  const mongoose = require('mongoose');
7
6
 
8
7
  mongoose.set('autoIndex', false); // we do not need create indexes щт еуыеы
9
8
 
10
- let mongoMemoryServerInstance;
11
-
12
9
  const redis = require('redis');
13
10
  const Server = require('../server');
14
11
 
15
12
  const clearRedisNamespace = require('../helpers/redis/clearNamespace');
16
13
 
17
14
  beforeAll(async () => {
18
- mongoMemoryServerInstance = await MongoMemoryReplSet.create({
19
- // binary: { version: '4.4.6' },
20
- replSet: { count: 1, storageEngine: 'wiredTiger' },
21
- });
22
- await mongoMemoryServerInstance.waitUntilRunning();
23
15
  process.env.LOGGER_CONSOLE_LEVEL = 'error';
24
- const connectionStringMongo = await mongoMemoryServerInstance.getUri();
25
- // console.info('MONGO_URI: ', connectionStringMongo);
26
16
  global.server = new Server({
27
17
  folders: {
28
18
  config: process.env.TEST_FOLDER_CONFIG || path.resolve('./config'),
@@ -42,8 +32,12 @@ beforeAll(async () => {
42
32
  },
43
33
  });
44
34
  await global.server.init({ isSkipModelInit: true });
35
+ const connectionString = process.env.TEST_MONGO_URI.replace(
36
+ '__DB_TO_REPLACE__',
37
+ `TEST_${crypto.randomUUID()}`,
38
+ );
45
39
  global.server.updateConfig('mongo', {
46
- connectionString: connectionStringMongo,
40
+ connectionString,
47
41
  });
48
42
  global.server.updateConfig('http', { port: 0 }); // allow to use random
49
43
  global.server.updateConfig('mail', { transport: 'stub' });
@@ -108,13 +102,9 @@ afterAll(async () => {
108
102
  global.server.app.httpServer.shutdown();
109
103
  global.server.app.events.emit('shutdown');
110
104
  }
111
- // setTimeout(async () => {
112
105
  if (typeof global.testSetup.afterAll === 'function') {
113
106
  await global.testSetup.afterAll();
114
107
  }
115
-
108
+ await mongoose.connection.db.dropDatabase(); // clean database after test
116
109
  await mongoose.disconnect();
117
- await mongoMemoryServerInstance.stop();
118
-
119
- // }, 2000);
120
110
  });
package/vitest.config.js CHANGED
@@ -3,7 +3,14 @@ import { defineConfig } from 'vitest/config';
3
3
 
4
4
  export default defineConfig({
5
5
  test: {
6
+ globalSetup: './tests/globalSetupVitest.js',
6
7
  setupFiles: './tests/setupVitest.js',
7
8
  testTimeout: 10000,
9
+ outputFile: './coverage/rspec.xml',
10
+ reporters: ['default', 'junit'],
11
+ coverage: {
12
+ enabled: true,
13
+ reporter: ['text', 'html', 'clover', 'json', 'cobertura'],
14
+ },
8
15
  },
9
16
  });
package/coverage/base.css DELETED
@@ -1,224 +0,0 @@
1
- body, html {
2
- margin:0; padding: 0;
3
- height: 100%;
4
- }
5
- body {
6
- font-family: Helvetica Neue, Helvetica, Arial;
7
- font-size: 14px;
8
- color:#333;
9
- }
10
- .small { font-size: 12px; }
11
- *, *:after, *:before {
12
- -webkit-box-sizing:border-box;
13
- -moz-box-sizing:border-box;
14
- box-sizing:border-box;
15
- }
16
- h1 { font-size: 20px; margin: 0;}
17
- h2 { font-size: 14px; }
18
- pre {
19
- font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace;
20
- margin: 0;
21
- padding: 0;
22
- -moz-tab-size: 2;
23
- -o-tab-size: 2;
24
- tab-size: 2;
25
- }
26
- a { color:#0074D9; text-decoration:none; }
27
- a:hover { text-decoration:underline; }
28
- .strong { font-weight: bold; }
29
- .space-top1 { padding: 10px 0 0 0; }
30
- .pad2y { padding: 20px 0; }
31
- .pad1y { padding: 10px 0; }
32
- .pad2x { padding: 0 20px; }
33
- .pad2 { padding: 20px; }
34
- .pad1 { padding: 10px; }
35
- .space-left2 { padding-left:55px; }
36
- .space-right2 { padding-right:20px; }
37
- .center { text-align:center; }
38
- .clearfix { display:block; }
39
- .clearfix:after {
40
- content:'';
41
- display:block;
42
- height:0;
43
- clear:both;
44
- visibility:hidden;
45
- }
46
- .fl { float: left; }
47
- @media only screen and (max-width:640px) {
48
- .col3 { width:100%; max-width:100%; }
49
- .hide-mobile { display:none!important; }
50
- }
51
-
52
- .quiet {
53
- color: #7f7f7f;
54
- color: rgba(0,0,0,0.5);
55
- }
56
- .quiet a { opacity: 0.7; }
57
-
58
- .fraction {
59
- font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace;
60
- font-size: 10px;
61
- color: #555;
62
- background: #E8E8E8;
63
- padding: 4px 5px;
64
- border-radius: 3px;
65
- vertical-align: middle;
66
- }
67
-
68
- div.path a:link, div.path a:visited { color: #333; }
69
- table.coverage {
70
- border-collapse: collapse;
71
- margin: 10px 0 0 0;
72
- padding: 0;
73
- }
74
-
75
- table.coverage td {
76
- margin: 0;
77
- padding: 0;
78
- vertical-align: top;
79
- }
80
- table.coverage td.line-count {
81
- text-align: right;
82
- padding: 0 5px 0 20px;
83
- }
84
- table.coverage td.line-coverage {
85
- text-align: right;
86
- padding-right: 10px;
87
- min-width:20px;
88
- }
89
-
90
- table.coverage td span.cline-any {
91
- display: inline-block;
92
- padding: 0 5px;
93
- width: 100%;
94
- }
95
- .missing-if-branch {
96
- display: inline-block;
97
- margin-right: 5px;
98
- border-radius: 3px;
99
- position: relative;
100
- padding: 0 4px;
101
- background: #333;
102
- color: yellow;
103
- }
104
-
105
- .skip-if-branch {
106
- display: none;
107
- margin-right: 10px;
108
- position: relative;
109
- padding: 0 4px;
110
- background: #ccc;
111
- color: white;
112
- }
113
- .missing-if-branch .typ, .skip-if-branch .typ {
114
- color: inherit !important;
115
- }
116
- .coverage-summary {
117
- border-collapse: collapse;
118
- width: 100%;
119
- }
120
- .coverage-summary tr { border-bottom: 1px solid #bbb; }
121
- .keyline-all { border: 1px solid #ddd; }
122
- .coverage-summary td, .coverage-summary th { padding: 10px; }
123
- .coverage-summary tbody { border: 1px solid #bbb; }
124
- .coverage-summary td { border-right: 1px solid #bbb; }
125
- .coverage-summary td:last-child { border-right: none; }
126
- .coverage-summary th {
127
- text-align: left;
128
- font-weight: normal;
129
- white-space: nowrap;
130
- }
131
- .coverage-summary th.file { border-right: none !important; }
132
- .coverage-summary th.pct { }
133
- .coverage-summary th.pic,
134
- .coverage-summary th.abs,
135
- .coverage-summary td.pct,
136
- .coverage-summary td.abs { text-align: right; }
137
- .coverage-summary td.file { white-space: nowrap; }
138
- .coverage-summary td.pic { min-width: 120px !important; }
139
- .coverage-summary tfoot td { }
140
-
141
- .coverage-summary .sorter {
142
- height: 10px;
143
- width: 7px;
144
- display: inline-block;
145
- margin-left: 0.5em;
146
- background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent;
147
- }
148
- .coverage-summary .sorted .sorter {
149
- background-position: 0 -20px;
150
- }
151
- .coverage-summary .sorted-desc .sorter {
152
- background-position: 0 -10px;
153
- }
154
- .status-line { height: 10px; }
155
- /* yellow */
156
- .cbranch-no { background: yellow !important; color: #111; }
157
- /* dark red */
158
- .red.solid, .status-line.low, .low .cover-fill { background:#C21F39 }
159
- .low .chart { border:1px solid #C21F39 }
160
- .highlighted,
161
- .highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{
162
- background: #C21F39 !important;
163
- }
164
- /* medium red */
165
- .cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE }
166
- /* light red */
167
- .low, .cline-no { background:#FCE1E5 }
168
- /* light green */
169
- .high, .cline-yes { background:rgb(230,245,208) }
170
- /* medium green */
171
- .cstat-yes { background:rgb(161,215,106) }
172
- /* dark green */
173
- .status-line.high, .high .cover-fill { background:rgb(77,146,33) }
174
- .high .chart { border:1px solid rgb(77,146,33) }
175
- /* dark yellow (gold) */
176
- .status-line.medium, .medium .cover-fill { background: #f9cd0b; }
177
- .medium .chart { border:1px solid #f9cd0b; }
178
- /* light yellow */
179
- .medium { background: #fff4c2; }
180
-
181
- .cstat-skip { background: #ddd; color: #111; }
182
- .fstat-skip { background: #ddd; color: #111 !important; }
183
- .cbranch-skip { background: #ddd !important; color: #111; }
184
-
185
- span.cline-neutral { background: #eaeaea; }
186
-
187
- .coverage-summary td.empty {
188
- opacity: .5;
189
- padding-top: 4px;
190
- padding-bottom: 4px;
191
- line-height: 1;
192
- color: #888;
193
- }
194
-
195
- .cover-fill, .cover-empty {
196
- display:inline-block;
197
- height: 12px;
198
- }
199
- .chart {
200
- line-height: 0;
201
- }
202
- .cover-empty {
203
- background: white;
204
- }
205
- .cover-full {
206
- border-right: none !important;
207
- }
208
- pre.prettyprint {
209
- border: none !important;
210
- padding: 0 !important;
211
- margin: 0 !important;
212
- }
213
- .com { color: #999 !important; }
214
- .ignore-none { color: #999; font-weight: normal; }
215
-
216
- .wrapper {
217
- min-height: 100%;
218
- height: auto !important;
219
- height: 100%;
220
- margin: 0 auto -48px;
221
- }
222
- .footer, .push {
223
- height: 48px;
224
- }
@@ -1,87 +0,0 @@
1
- /* eslint-disable */
2
- var jumpToCode = (function init() {
3
- // Classes of code we would like to highlight in the file view
4
- var missingCoverageClasses = ['.cbranch-no', '.cstat-no', '.fstat-no'];
5
-
6
- // Elements to highlight in the file listing view
7
- var fileListingElements = ['td.pct.low'];
8
-
9
- // We don't want to select elements that are direct descendants of another match
10
- var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > `
11
-
12
- // Selecter that finds elements on the page to which we can jump
13
- var selector =
14
- fileListingElements.join(', ') +
15
- ', ' +
16
- notSelector +
17
- missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b`
18
-
19
- // The NodeList of matching elements
20
- var missingCoverageElements = document.querySelectorAll(selector);
21
-
22
- var currentIndex;
23
-
24
- function toggleClass(index) {
25
- missingCoverageElements
26
- .item(currentIndex)
27
- .classList.remove('highlighted');
28
- missingCoverageElements.item(index).classList.add('highlighted');
29
- }
30
-
31
- function makeCurrent(index) {
32
- toggleClass(index);
33
- currentIndex = index;
34
- missingCoverageElements.item(index).scrollIntoView({
35
- behavior: 'smooth',
36
- block: 'center',
37
- inline: 'center'
38
- });
39
- }
40
-
41
- function goToPrevious() {
42
- var nextIndex = 0;
43
- if (typeof currentIndex !== 'number' || currentIndex === 0) {
44
- nextIndex = missingCoverageElements.length - 1;
45
- } else if (missingCoverageElements.length > 1) {
46
- nextIndex = currentIndex - 1;
47
- }
48
-
49
- makeCurrent(nextIndex);
50
- }
51
-
52
- function goToNext() {
53
- var nextIndex = 0;
54
-
55
- if (
56
- typeof currentIndex === 'number' &&
57
- currentIndex < missingCoverageElements.length - 1
58
- ) {
59
- nextIndex = currentIndex + 1;
60
- }
61
-
62
- makeCurrent(nextIndex);
63
- }
64
-
65
- return function jump(event) {
66
- if (
67
- document.getElementById('fileSearch') === document.activeElement &&
68
- document.activeElement != null
69
- ) {
70
- // if we're currently focused on the search input, we don't want to navigate
71
- return;
72
- }
73
-
74
- switch (event.which) {
75
- case 78: // n
76
- case 74: // j
77
- goToNext();
78
- break;
79
- case 66: // b
80
- case 75: // k
81
- case 80: // p
82
- goToPrevious();
83
- break;
84
- }
85
- };
86
- })();
87
- window.addEventListener('keydown', jumpToCode);