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.
Files changed (54) hide show
  1. package/.github/workflows/codeql-analysis.yml +4 -4
  2. package/.github/workflows/nodejs.yml +3 -3
  3. package/.vscode/launch.json +24 -0
  4. package/README.md +71 -15
  5. package/SECURITY.md +2 -0
  6. package/coverage/base.css +224 -0
  7. package/coverage/block-navigation.js +87 -0
  8. package/coverage/clover.xml +222 -0
  9. package/coverage/coverage-final.json +6 -0
  10. package/coverage/csvToJson/index.html +116 -0
  11. package/coverage/csvToJson/index.js.html +565 -0
  12. package/coverage/csvToJson/src/csvToJson.js.html +757 -0
  13. package/coverage/csvToJson/src/index.html +116 -0
  14. package/coverage/csvToJson/src/util/fileUtils.js.html +151 -0
  15. package/coverage/csvToJson/src/util/index.html +146 -0
  16. package/coverage/csvToJson/src/util/jsonUtils.js.html +127 -0
  17. package/coverage/csvToJson/src/util/stringUtils.js.html +196 -0
  18. package/coverage/favicon.png +0 -0
  19. package/coverage/index.html +146 -0
  20. package/coverage/lcov-report/base.css +224 -0
  21. package/coverage/lcov-report/block-navigation.js +87 -0
  22. package/coverage/lcov-report/csvToJson/index.html +116 -0
  23. package/coverage/lcov-report/csvToJson/index.js.html +565 -0
  24. package/coverage/lcov-report/csvToJson/src/csvToJson.js.html +757 -0
  25. package/coverage/lcov-report/csvToJson/src/index.html +116 -0
  26. package/coverage/lcov-report/csvToJson/src/util/fileUtils.js.html +151 -0
  27. package/coverage/lcov-report/csvToJson/src/util/index.html +146 -0
  28. package/coverage/lcov-report/csvToJson/src/util/jsonUtils.js.html +127 -0
  29. package/coverage/lcov-report/csvToJson/src/util/stringUtils.js.html +196 -0
  30. package/coverage/lcov-report/favicon.png +0 -0
  31. package/coverage/lcov-report/index.html +146 -0
  32. package/coverage/lcov-report/prettify.css +1 -0
  33. package/coverage/lcov-report/prettify.js +2 -0
  34. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  35. package/coverage/lcov-report/sorter.js +196 -0
  36. package/coverage/lcov-report/src/csvToJson.js.html +757 -0
  37. package/coverage/lcov-report/src/index.html +116 -0
  38. package/coverage/lcov-report/src/util/fileUtils.js.html +151 -0
  39. package/coverage/lcov-report/src/util/index.html +146 -0
  40. package/coverage/lcov-report/src/util/jsonUtils.js.html +127 -0
  41. package/coverage/lcov-report/src/util/stringUtils.js.html +196 -0
  42. package/coverage/lcov.info +410 -0
  43. package/coverage/prettify.css +1 -0
  44. package/coverage/prettify.js +2 -0
  45. package/coverage/sort-arrow-sprite.png +0 -0
  46. package/coverage/sorter.js +196 -0
  47. package/index.js +7 -0
  48. package/jest.config.js +9 -0
  49. package/package.json +7 -6
  50. package/src/csvToJson.js +87 -5
  51. package/.idea/csvToJson.iml +0 -9
  52. package/.idea/misc.xml +0 -6
  53. package/.idea/modules.xml +0 -8
  54. 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@v3
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@v2
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@v2
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@v2
67
+ uses: github/codeql-action/analyze@v3
@@ -9,12 +9,12 @@ jobs:
9
9
 
10
10
  strategy:
11
11
  matrix:
12
- node-version: [12.x, 14.x, 16.x]
12
+ node-version: [14.x, 16.x, 18.x, 20.x, 21.x]
13
13
 
14
14
  steps:
15
- - uses: actions/checkout@v3
15
+ - uses: actions/checkout@v4
16
16
  - name: Use Node.js ${{ matrix.node-version }}
17
- uses: actions/setup-node@v3
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
  [![Known Vulnerabilities](https://snyk.io/test/github/iuccio/csvToJson/badge.svg)](https://snyk.io/test/github/iuccio/csvToJson)
5
5
  [![Code Climate](https://codeclimate.com/github/iuccio/csvToJson/badges/gpa.svg)](https://codeclimate.com/github/iuccio/csvToJson)
6
6
  [![NPM Version](https://img.shields.io/npm/v/convert-csv-to-json.svg)](https://npmjs.org/package/convert-csv-to-json)
7
- ![NodeJS Version](https://img.shields.io/badge/nodeJS-%3E=12.x-brightgreen.svg)
7
+ ![NodeJS Version](https://img.shields.io/badge/nodeJS-%3E=14.x-brightgreen.svg)
8
8
  [![Downloads](https://img.shields.io/npm/dm/convert-csv-to-json.svg)](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('*',',').getJsonFromCsv('myInputFile.csv');
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(',').getJsonFromCsv(fileInputName);
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).getJsonFromCsv(fileInputName);
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().getJsonFromCsv(fileInputName);
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().getJsonFromCsv(fileInputName);
247
+ csvToJson.utf8Encoding()
248
+ .getJsonFromCsv(fileInputName);
216
249
  ```
217
250
  * ucs2:
218
251
  ```js
219
- csvToJson.ucs2Encoding().getJsonFromCsv(fileInputName);
252
+ csvToJson.ucs2Encoding()
253
+ .getJsonFromCsv(fileInputName);
220
254
  ```
221
255
  * utf16le:
222
256
  ```js
223
- csvToJson.utf16leEncoding().getJsonFromCsv(fileInputName);
257
+ csvToJson.utf16leEncoding()
258
+ .getJsonFromCsv(fileInputName);
224
259
  ```
225
260
  * latin1:
226
261
  ```js
227
- csvToJson.latin1Encoding().getJsonFromCsv(fileInputName);
262
+ csvToJson.latin1Encoding()
263
+ .getJsonFromCsv(fileInputName);
228
264
  ```
229
265
  * ascii:
230
266
  ```js
231
- csvToJson.asciiEncoding().getJsonFromCsv(fileInputName);
267
+ csvToJson.asciiEncoding()
268
+ .getJsonFromCsv(fileInputName);
232
269
  ```
233
270
  * base64:
234
271
  ```js
235
- csvToJson.base64Encoding().getJsonFromCsv(fileInputName);
272
+ csvToJson.base64Encoding()
273
+ .getJsonFromCsv(fileInputName);
236
274
  ```
237
275
  * hex:
238
276
  ```js
239
- csvToJson.hexEncoding().getJsonFromCsv(fileInputName);
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
- * Watch Tests
306
+ * Debug Tests
252
307
  ~~~
253
- npm run test-watch
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: 3KCCK292a61AHrKuVCFZ8Agr3j31Zw8Mzg
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);