convert-csv-to-json 1.5.0 → 2.1.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/.github/workflows/codeql-analysis.yml +4 -4
- package/.github/workflows/nodejs.yml +3 -3
- package/.vscode/launch.json +24 -0
- package/README.md +71 -15
- package/SECURITY.md +2 -0
- package/coverage/base.css +224 -0
- package/coverage/block-navigation.js +87 -0
- package/coverage/clover.xml +222 -0
- package/coverage/coverage-final.json +6 -0
- package/coverage/csvToJson/index.html +116 -0
- package/coverage/csvToJson/index.js.html +565 -0
- package/coverage/csvToJson/src/csvToJson.js.html +757 -0
- package/coverage/csvToJson/src/index.html +116 -0
- package/coverage/csvToJson/src/util/fileUtils.js.html +151 -0
- package/coverage/csvToJson/src/util/index.html +146 -0
- package/coverage/csvToJson/src/util/jsonUtils.js.html +127 -0
- package/coverage/csvToJson/src/util/stringUtils.js.html +196 -0
- package/coverage/favicon.png +0 -0
- package/coverage/index.html +146 -0
- package/coverage/lcov-report/base.css +224 -0
- package/coverage/lcov-report/block-navigation.js +87 -0
- package/coverage/lcov-report/csvToJson/index.html +116 -0
- package/coverage/lcov-report/csvToJson/index.js.html +565 -0
- package/coverage/lcov-report/csvToJson/src/csvToJson.js.html +757 -0
- package/coverage/lcov-report/csvToJson/src/index.html +116 -0
- package/coverage/lcov-report/csvToJson/src/util/fileUtils.js.html +151 -0
- package/coverage/lcov-report/csvToJson/src/util/index.html +146 -0
- package/coverage/lcov-report/csvToJson/src/util/jsonUtils.js.html +127 -0
- package/coverage/lcov-report/csvToJson/src/util/stringUtils.js.html +196 -0
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/index.html +146 -0
- package/coverage/lcov-report/prettify.css +1 -0
- package/coverage/lcov-report/prettify.js +2 -0
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +196 -0
- package/coverage/lcov-report/src/csvToJson.js.html +757 -0
- package/coverage/lcov-report/src/index.html +116 -0
- package/coverage/lcov-report/src/util/fileUtils.js.html +151 -0
- package/coverage/lcov-report/src/util/index.html +146 -0
- package/coverage/lcov-report/src/util/jsonUtils.js.html +127 -0
- package/coverage/lcov-report/src/util/stringUtils.js.html +196 -0
- package/coverage/lcov.info +410 -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/index.js +7 -0
- package/jest.config.js +9 -0
- package/package.json +7 -6
- package/src/csvToJson.js +87 -5
- package/.idea/csvToJson.iml +0 -9
- package/.idea/misc.xml +0 -6
- package/.idea/modules.xml +0 -8
- package/.idea/vcs.xml +0 -6
|
@@ -35,11 +35,11 @@ jobs:
|
|
|
35
35
|
|
|
36
36
|
steps:
|
|
37
37
|
- name: Checkout repository
|
|
38
|
-
uses: actions/checkout@
|
|
38
|
+
uses: actions/checkout@v4
|
|
39
39
|
|
|
40
40
|
# Initializes the CodeQL tools for scanning.
|
|
41
41
|
- name: Initialize CodeQL
|
|
42
|
-
uses: github/codeql-action/init@
|
|
42
|
+
uses: github/codeql-action/init@v3
|
|
43
43
|
with:
|
|
44
44
|
languages: ${{ matrix.language }}
|
|
45
45
|
# If you wish to specify custom queries, you can do so here or in a config file.
|
|
@@ -50,7 +50,7 @@ jobs:
|
|
|
50
50
|
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
|
51
51
|
# If this step fails, then you should remove it and run the build manually (see below)
|
|
52
52
|
- name: Autobuild
|
|
53
|
-
uses: github/codeql-action/autobuild@
|
|
53
|
+
uses: github/codeql-action/autobuild@v3
|
|
54
54
|
|
|
55
55
|
# ℹ️ Command-line programs to run using the OS shell.
|
|
56
56
|
# 📚 https://git.io/JvXDl
|
|
@@ -64,4 +64,4 @@ jobs:
|
|
|
64
64
|
# make release
|
|
65
65
|
|
|
66
66
|
- name: Perform CodeQL Analysis
|
|
67
|
-
uses: github/codeql-action/analyze@
|
|
67
|
+
uses: github/codeql-action/analyze@v3
|
|
@@ -9,12 +9,12 @@ jobs:
|
|
|
9
9
|
|
|
10
10
|
strategy:
|
|
11
11
|
matrix:
|
|
12
|
-
node-version: [
|
|
12
|
+
node-version: [14.x, 16.x, 18.x, 20.x, 21.x]
|
|
13
13
|
|
|
14
14
|
steps:
|
|
15
|
-
- uses: actions/checkout@
|
|
15
|
+
- uses: actions/checkout@v4
|
|
16
16
|
- name: Use Node.js ${{ matrix.node-version }}
|
|
17
|
-
uses: actions/setup-node@
|
|
17
|
+
uses: actions/setup-node@v4
|
|
18
18
|
with:
|
|
19
19
|
node-version: ${{ matrix.node-version }}
|
|
20
20
|
- name: npm install, build, and test
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
// Use IntelliSense to learn about possible attributes.
|
|
3
|
+
// Hover to view descriptions of existing attributes.
|
|
4
|
+
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
|
5
|
+
"version": "0.2.0",
|
|
6
|
+
"configurations": [
|
|
7
|
+
{
|
|
8
|
+
"name": "Launch Chrome",
|
|
9
|
+
"request": "launch",
|
|
10
|
+
"type": "chrome",
|
|
11
|
+
"url": "http://localhost:8080",
|
|
12
|
+
"webRoot": "${workspaceFolder}"
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"type": "node",
|
|
16
|
+
"request": "launch",
|
|
17
|
+
"name": "Launch Program",
|
|
18
|
+
"skipFiles": [
|
|
19
|
+
"<node_internals>/**"
|
|
20
|
+
],
|
|
21
|
+
"program": "${workspaceFolder}/index.js"
|
|
22
|
+
}
|
|
23
|
+
]
|
|
24
|
+
}
|
package/README.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
[](https://snyk.io/test/github/iuccio/csvToJson)
|
|
5
5
|
[](https://codeclimate.com/github/iuccio/csvToJson)
|
|
6
6
|
[](https://npmjs.org/package/convert-csv-to-json)
|
|
7
|
-

|
|
8
8
|
[](https://npmjs.org/package/convert-csv-to-json)
|
|
9
9
|
|
|
10
10
|
**This project is not dependent on others packages or libraries.**
|
|
@@ -23,12 +23,14 @@
|
|
|
23
23
|
+ [Generate Array of Object in JSON format](#generate-array-of-object-in-json-format)
|
|
24
24
|
+ [Generate Object with sub array](#generate-object-with-sub-array)
|
|
25
25
|
+ [Define field delimiter](#define-field-delimiter)
|
|
26
|
+
+ [Support Quoted Fields](#support-quoted-fields)
|
|
26
27
|
+ [Index header](#index-header)
|
|
27
28
|
+ [Empty rows](#empty-rows)
|
|
28
29
|
+ [Format property value by type](#format-property-value-by-type)
|
|
29
30
|
- [Number](#number)
|
|
30
31
|
- [Boolean](#boolean)
|
|
31
32
|
+ [Encoding](#encoding)
|
|
33
|
+
* [Chaining Pattern](#chaining-pattern)
|
|
32
34
|
- [Development](#development)
|
|
33
35
|
- [License](#license)
|
|
34
36
|
- [Buy me a Coffee](#buy-me-a-coffee)
|
|
@@ -95,6 +97,7 @@ $ npm install -g convert-csv-to-json
|
|
|
95
97
|
```
|
|
96
98
|
|
|
97
99
|
### Usage
|
|
100
|
+
|
|
98
101
|
#### Generate JSON file
|
|
99
102
|
```js
|
|
100
103
|
let csvToJson = require('convert-csv-to-json');
|
|
@@ -123,7 +126,8 @@ Given the above CSV example, to generate a JSON Object with properties that cont
|
|
|
123
126
|
with the values <b>*diego,marek,dries*</b> you have to call the function ```parseSubArray(delimiter, separator)``` .
|
|
124
127
|
To generate the JSON Object with sub array from the above CSV example:
|
|
125
128
|
```js
|
|
126
|
-
csvToJson.parseSubArray('*',',')
|
|
129
|
+
csvToJson.parseSubArray('*',',')
|
|
130
|
+
.getJsonFromCsv('myInputFile.csv');
|
|
127
131
|
```
|
|
128
132
|
The result will be:
|
|
129
133
|
```json
|
|
@@ -147,14 +151,41 @@ In case your CSV file has defined another field delimiter you have to call the f
|
|
|
147
151
|
E.g. if your field delimiter is the comma **,** then:
|
|
148
152
|
|
|
149
153
|
```js
|
|
150
|
-
csvToJson.fieldDelimiter(',')
|
|
154
|
+
csvToJson.fieldDelimiter(',')
|
|
155
|
+
.getJsonFromCsv(fileInputName);
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
#### Support Quoted Fields
|
|
159
|
+
To be able to parse correctly fields wrapped in quote, like the **last_name** in the first row in the following example:
|
|
160
|
+
|
|
161
|
+
|first_name| last_name |email|
|
|
162
|
+
|:----------:|:--------------------------:|:---:|
|
|
163
|
+
|Constantin| "Langsdon,Nandson,Gangson" |clangsdon0@hc360.com|
|
|
164
|
+
|
|
165
|
+
you need to activate the support quoted fields feature:
|
|
166
|
+
|
|
167
|
+
```js
|
|
168
|
+
csvToJson.supportQuotedField(true)
|
|
169
|
+
.getJsonFromCsv(fileInputName);
|
|
151
170
|
```
|
|
152
171
|
|
|
172
|
+
The result will be:
|
|
173
|
+
```json
|
|
174
|
+
[
|
|
175
|
+
{
|
|
176
|
+
"firstName": "Constantin",
|
|
177
|
+
"lastName": "Langsdon,Nandson,Gangson",
|
|
178
|
+
"email": "clangsdon0@hc360.com"
|
|
179
|
+
}
|
|
180
|
+
]
|
|
181
|
+
```
|
|
182
|
+
|
|
153
183
|
#### Index header
|
|
154
184
|
If the header is not on the first line you can define the header index like:
|
|
155
185
|
|
|
156
186
|
```js
|
|
157
|
-
csvToJson.indexHeader(3)
|
|
187
|
+
csvToJson.indexHeader(3)
|
|
188
|
+
.getJsonFromCsv(fileInputName);
|
|
158
189
|
```
|
|
159
190
|
|
|
160
191
|
#### Empty rows
|
|
@@ -163,7 +194,8 @@ Empty rows are ignored and not parsed.
|
|
|
163
194
|
#### Format property value by type
|
|
164
195
|
If you want that a number will be printed as a Number type, and values *true* or *false* is printed as a boolean Type, use:
|
|
165
196
|
```js
|
|
166
|
-
csvToJson.formatValueByType()
|
|
197
|
+
csvToJson.formatValueByType()
|
|
198
|
+
.getJsonFromCsv(fileInputName);
|
|
167
199
|
```
|
|
168
200
|
For example:
|
|
169
201
|
|
|
@@ -212,33 +244,56 @@ instead of
|
|
|
212
244
|
You can read and decode files with the following encoding:
|
|
213
245
|
* utf8:
|
|
214
246
|
```js
|
|
215
|
-
csvToJson.utf8Encoding()
|
|
247
|
+
csvToJson.utf8Encoding()
|
|
248
|
+
.getJsonFromCsv(fileInputName);
|
|
216
249
|
```
|
|
217
250
|
* ucs2:
|
|
218
251
|
```js
|
|
219
|
-
csvToJson.ucs2Encoding()
|
|
252
|
+
csvToJson.ucs2Encoding()
|
|
253
|
+
.getJsonFromCsv(fileInputName);
|
|
220
254
|
```
|
|
221
255
|
* utf16le:
|
|
222
256
|
```js
|
|
223
|
-
csvToJson.utf16leEncoding()
|
|
257
|
+
csvToJson.utf16leEncoding()
|
|
258
|
+
.getJsonFromCsv(fileInputName);
|
|
224
259
|
```
|
|
225
260
|
* latin1:
|
|
226
261
|
```js
|
|
227
|
-
csvToJson.latin1Encoding()
|
|
262
|
+
csvToJson.latin1Encoding()
|
|
263
|
+
.getJsonFromCsv(fileInputName);
|
|
228
264
|
```
|
|
229
265
|
* ascii:
|
|
230
266
|
```js
|
|
231
|
-
csvToJson.asciiEncoding()
|
|
267
|
+
csvToJson.asciiEncoding()
|
|
268
|
+
.getJsonFromCsv(fileInputName);
|
|
232
269
|
```
|
|
233
270
|
* base64:
|
|
234
271
|
```js
|
|
235
|
-
csvToJson.base64Encoding()
|
|
272
|
+
csvToJson.base64Encoding()
|
|
273
|
+
.getJsonFromCsv(fileInputName);
|
|
236
274
|
```
|
|
237
275
|
* hex:
|
|
238
276
|
```js
|
|
239
|
-
csvToJson.hexEncoding()
|
|
277
|
+
csvToJson.hexEncoding()
|
|
278
|
+
.getJsonFromCsv(fileInputName);
|
|
240
279
|
```
|
|
241
280
|
|
|
281
|
+
### Chaining Pattern
|
|
282
|
+
|
|
283
|
+
The exposed API is implemented with the [Method Chaining Pattern](https://en.wikipedia.org/wiki/Method_chaining), which means that multiple methods can be chained, e.g.:
|
|
284
|
+
|
|
285
|
+
```js
|
|
286
|
+
let csvToJson = require('convert-csv-to-json');
|
|
287
|
+
|
|
288
|
+
csvToJson.fieldDelimiter(',')
|
|
289
|
+
.formatValueByType()
|
|
290
|
+
.parseSubArray("*",',')
|
|
291
|
+
.supportQuotedField(true)
|
|
292
|
+
.getJsonFromCsv('myInputFile.csv');
|
|
293
|
+
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
|
|
242
297
|
## Development
|
|
243
298
|
* Download all csvToJson dependencies:
|
|
244
299
|
~~~
|
|
@@ -248,9 +303,9 @@ You can read and decode files with the following encoding:
|
|
|
248
303
|
~~~
|
|
249
304
|
npm test
|
|
250
305
|
~~~
|
|
251
|
-
*
|
|
306
|
+
* Debug Tests
|
|
252
307
|
~~~
|
|
253
|
-
npm run test-
|
|
308
|
+
npm run test-debug
|
|
254
309
|
~~~
|
|
255
310
|
|
|
256
311
|
## License
|
|
@@ -258,4 +313,5 @@ CSVtoJSON is licensed under the GNU General Public License v3.0 [License](LICENS
|
|
|
258
313
|
|
|
259
314
|
## Buy me a Coffee
|
|
260
315
|
Just if you want to support this repository:
|
|
261
|
-
* **BTC** tip address:
|
|
316
|
+
* **BTC** tip address:
|
|
317
|
+
37vdjQhbaR7k7XzhMKWzMcnqUxfw1njBNk
|
package/SECURITY.md
CHANGED
|
@@ -14,6 +14,7 @@ A generated Github Depedabot PR is normally quickly merged and a new version is
|
|
|
14
14
|
|
|
15
15
|
| Version | Supported |
|
|
16
16
|
| ------- | ------------------ |
|
|
17
|
+
| 2.0.0 | :white_check_mark: |
|
|
17
18
|
| 1.4.0 | :white_check_mark: |
|
|
18
19
|
| 1.3.3 | :white_check_mark: |
|
|
19
20
|
| 1.3.2 | :white_check_mark: |
|
|
@@ -22,6 +23,7 @@ A generated Github Depedabot PR is normally quickly merged and a new version is
|
|
|
22
23
|
|
|
23
24
|
| Version | Supported |
|
|
24
25
|
| ------- | ------------------ |
|
|
26
|
+
| 2.0.0 | :white_check_mark: |
|
|
25
27
|
| 1.4.0 | :white_check_mark: |
|
|
26
28
|
| 1.3.3 | :warning: moderate dev dependencies vulnerability|
|
|
27
29
|
| 1.3.2 | :warning: moderate dev dependencies vulnerability|
|
|
@@ -0,0 +1,224 @@
|
|
|
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
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
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);
|