@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.
- package/CHANGELOG.md +8 -0
- package/package.json +2 -2
- package/services/http/HttpServer.js +1 -1
- package/services/http/middleware/RateLimiter.js +3 -3
- package/services/http/middleware/RateLimiter.test.js +2 -2
- package/services/http/middleware/Role.js +1 -1
- package/services/http/middleware/Role.test.js +1 -1
- package/tests/globalSetupVitest.js +35 -0
- package/tests/setupVitest.js +7 -17
- package/vitest.config.js +7 -0
- package/coverage/base.css +0 -224
- package/coverage/block-navigation.js +0 -87
- package/coverage/clover.xml +0 -3573
- package/coverage/coverage-final.json +0 -44
- package/coverage/favicon.png +0 -0
- package/coverage/framework/config/auth.js.html +0 -100
- package/coverage/framework/config/http.js.html +0 -112
- package/coverage/framework/config/i18n.js.html +0 -121
- package/coverage/framework/config/index.html +0 -236
- package/coverage/framework/config/log.js.html +0 -151
- package/coverage/framework/config/mail.js.html +0 -172
- package/coverage/framework/config/mongo.js.html +0 -94
- package/coverage/framework/config/rateLimiter.js.html +0 -133
- package/coverage/framework/config/redis.js.html +0 -97
- package/coverage/framework/config/validate.js.html +0 -94
- package/coverage/framework/controllers/Auth.js.html +0 -715
- package/coverage/framework/controllers/Home.js.html +0 -169
- package/coverage/framework/controllers/index.html +0 -146
- package/coverage/framework/controllers/index.js.html +0 -259
- package/coverage/framework/controllers/test/SomeController.js.html +0 -571
- package/coverage/framework/controllers/test/index.html +0 -116
- package/coverage/framework/helpers/files.js.html +0 -310
- package/coverage/framework/helpers/index.html +0 -131
- package/coverage/framework/helpers/logger.js.html +0 -142
- package/coverage/framework/helpers/redis/clearNamespace.js.html +0 -127
- package/coverage/framework/helpers/redis/index.html +0 -116
- package/coverage/framework/index.html +0 -116
- package/coverage/framework/models/Migration.js.html +0 -130
- package/coverage/framework/models/Sequence.js.html +0 -151
- package/coverage/framework/models/User.js.html +0 -859
- package/coverage/framework/models/index.html +0 -146
- package/coverage/framework/modules/AbstractController.js.html +0 -1309
- package/coverage/framework/modules/AbstractModel.js.html +0 -268
- package/coverage/framework/modules/Base.js.html +0 -244
- package/coverage/framework/modules/index.html +0 -146
- package/coverage/framework/server.js.html +0 -1279
- package/coverage/framework/services/cache/Cache.js.html +0 -445
- package/coverage/framework/services/cache/index.html +0 -116
- package/coverage/framework/services/documentation/DocumentationGenerator.js.html +0 -592
- package/coverage/framework/services/documentation/index.html +0 -116
- package/coverage/framework/services/http/HttpServer.js.html +0 -373
- package/coverage/framework/services/http/index.html +0 -116
- package/coverage/framework/services/http/middleware/AbstractMiddleware.js.html +0 -238
- package/coverage/framework/services/http/middleware/Auth.js.html +0 -145
- package/coverage/framework/services/http/middleware/GetUserByToken.js.html +0 -223
- package/coverage/framework/services/http/middleware/I18n.js.html +0 -442
- package/coverage/framework/services/http/middleware/Pagination.js.html +0 -253
- package/coverage/framework/services/http/middleware/PrepareAppInfo.js.html +0 -139
- package/coverage/framework/services/http/middleware/RateLimiter.js.html +0 -472
- package/coverage/framework/services/http/middleware/RequestLogger.js.html +0 -151
- package/coverage/framework/services/http/middleware/RequestParser.js.html +0 -199
- package/coverage/framework/services/http/middleware/Role.js.html +0 -172
- package/coverage/framework/services/http/middleware/index.html +0 -251
- package/coverage/framework/services/http/middleware/test/CheckFlag.js.html +0 -139
- package/coverage/framework/services/http/middleware/test/index.html +0 -116
- package/coverage/framework/services/messaging/email/index.html +0 -116
- package/coverage/framework/services/messaging/email/index.js.html +0 -739
- package/coverage/framework/services/messaging/index.html +0 -116
- package/coverage/framework/services/messaging/index.js.html +0 -100
- package/coverage/framework/services/validate/ValidateService.js.html +0 -556
- package/coverage/framework/services/validate/drivers/AbstractValidator.js.html +0 -196
- package/coverage/framework/services/validate/drivers/CustomValidator.js.html +0 -241
- package/coverage/framework/services/validate/drivers/YupValidator.js.html +0 -394
- package/coverage/framework/services/validate/drivers/index.html +0 -146
- package/coverage/framework/services/validate/index.html +0 -116
- package/coverage/index.html +0 -356
- package/coverage/prettify.css +0 -1
- package/coverage/prettify.js +0 -2
- package/coverage/sort-arrow-sprite.png +0 -0
- 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.
|
|
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
|
|
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).
|
|
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
|
-
`
|
|
108
|
+
`RateLimiter not inited correclty! Please check init logs `,
|
|
109
109
|
);
|
|
110
|
-
return res.status(500).
|
|
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).
|
|
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
|
-
|
|
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
|
-
|
|
140
|
+
json() {
|
|
141
141
|
isSend = true;
|
|
142
142
|
},
|
|
143
143
|
},
|
|
@@ -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 };
|
package/tests/setupVitest.js
CHANGED
|
@@ -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
|
|
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);
|