convert-csv-to-json 2.0.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 (55) 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 +47 -16
  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 +1 -1
  48. package/jest.config.js +9 -0
  49. package/package.json +7 -6
  50. package/.idea/codeStyles/codeStyleConfig.xml +0 -5
  51. package/.idea/csv-plugin.xml +0 -51
  52. package/.idea/csvToJson.iml +0 -9
  53. package/.idea/misc.xml +0 -6
  54. package/.idea/modules.xml +0 -8
  55. 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, 18.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.**
@@ -30,6 +30,7 @@
30
30
  - [Number](#number)
31
31
  - [Boolean](#boolean)
32
32
  + [Encoding](#encoding)
33
+ * [Chaining Pattern](#chaining-pattern)
33
34
  - [Development](#development)
34
35
  - [License](#license)
35
36
  - [Buy me a Coffee](#buy-me-a-coffee)
@@ -96,6 +97,7 @@ $ npm install -g convert-csv-to-json
96
97
  ```
97
98
 
98
99
  ### Usage
100
+
99
101
  #### Generate JSON file
100
102
  ```js
101
103
  let csvToJson = require('convert-csv-to-json');
@@ -124,7 +126,8 @@ Given the above CSV example, to generate a JSON Object with properties that cont
124
126
  with the values <b>*diego,marek,dries*</b> you have to call the function ```parseSubArray(delimiter, separator)``` .
125
127
  To generate the JSON Object with sub array from the above CSV example:
126
128
  ```js
127
- csvToJson.parseSubArray('*',',').getJsonFromCsv('myInputFile.csv');
129
+ csvToJson.parseSubArray('*',',')
130
+ .getJsonFromCsv('myInputFile.csv');
128
131
  ```
129
132
  The result will be:
130
133
  ```json
@@ -148,7 +151,8 @@ In case your CSV file has defined another field delimiter you have to call the f
148
151
  E.g. if your field delimiter is the comma **,** then:
149
152
 
150
153
  ```js
151
- csvToJson.fieldDelimiter(',').getJsonFromCsv(fileInputName);
154
+ csvToJson.fieldDelimiter(',')
155
+ .getJsonFromCsv(fileInputName);
152
156
  ```
153
157
 
154
158
  #### Support Quoted Fields
@@ -161,7 +165,8 @@ To be able to parse correctly fields wrapped in quote, like the **last_name** in
161
165
  you need to activate the support quoted fields feature:
162
166
 
163
167
  ```js
164
- csvToJson.supportQuotedField(true).getJsonFromCsv(fileInputName);
168
+ csvToJson.supportQuotedField(true)
169
+ .getJsonFromCsv(fileInputName);
165
170
  ```
166
171
 
167
172
  The result will be:
@@ -179,7 +184,8 @@ The result will be:
179
184
  If the header is not on the first line you can define the header index like:
180
185
 
181
186
  ```js
182
- csvToJson.indexHeader(3).getJsonFromCsv(fileInputName);
187
+ csvToJson.indexHeader(3)
188
+ .getJsonFromCsv(fileInputName);
183
189
  ```
184
190
 
185
191
  #### Empty rows
@@ -188,7 +194,8 @@ Empty rows are ignored and not parsed.
188
194
  #### Format property value by type
189
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:
190
196
  ```js
191
- csvToJson.formatValueByType().getJsonFromCsv(fileInputName);
197
+ csvToJson.formatValueByType()
198
+ .getJsonFromCsv(fileInputName);
192
199
  ```
193
200
  For example:
194
201
 
@@ -237,33 +244,56 @@ instead of
237
244
  You can read and decode files with the following encoding:
238
245
  * utf8:
239
246
  ```js
240
- csvToJson.utf8Encoding().getJsonFromCsv(fileInputName);
247
+ csvToJson.utf8Encoding()
248
+ .getJsonFromCsv(fileInputName);
241
249
  ```
242
250
  * ucs2:
243
251
  ```js
244
- csvToJson.ucs2Encoding().getJsonFromCsv(fileInputName);
252
+ csvToJson.ucs2Encoding()
253
+ .getJsonFromCsv(fileInputName);
245
254
  ```
246
255
  * utf16le:
247
256
  ```js
248
- csvToJson.utf16leEncoding().getJsonFromCsv(fileInputName);
257
+ csvToJson.utf16leEncoding()
258
+ .getJsonFromCsv(fileInputName);
249
259
  ```
250
260
  * latin1:
251
261
  ```js
252
- csvToJson.latin1Encoding().getJsonFromCsv(fileInputName);
262
+ csvToJson.latin1Encoding()
263
+ .getJsonFromCsv(fileInputName);
253
264
  ```
254
265
  * ascii:
255
266
  ```js
256
- csvToJson.asciiEncoding().getJsonFromCsv(fileInputName);
267
+ csvToJson.asciiEncoding()
268
+ .getJsonFromCsv(fileInputName);
257
269
  ```
258
270
  * base64:
259
271
  ```js
260
- csvToJson.base64Encoding().getJsonFromCsv(fileInputName);
272
+ csvToJson.base64Encoding()
273
+ .getJsonFromCsv(fileInputName);
261
274
  ```
262
275
  * hex:
263
276
  ```js
264
- csvToJson.hexEncoding().getJsonFromCsv(fileInputName);
277
+ csvToJson.hexEncoding()
278
+ .getJsonFromCsv(fileInputName);
265
279
  ```
266
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
+
267
297
  ## Development
268
298
  * Download all csvToJson dependencies:
269
299
  ~~~
@@ -273,9 +303,9 @@ You can read and decode files with the following encoding:
273
303
  ~~~
274
304
  npm test
275
305
  ~~~
276
- * Watch Tests
306
+ * Debug Tests
277
307
  ~~~
278
- npm run test-watch
308
+ npm run test-debug
279
309
  ~~~
280
310
 
281
311
  ## License
@@ -283,4 +313,5 @@ CSVtoJSON is licensed under the GNU General Public License v3.0 [License](LICENS
283
313
 
284
314
  ## Buy me a Coffee
285
315
  Just if you want to support this repository:
286
- * **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);