convert-csv-to-json 4.14.0 → 4.16.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 (38) hide show
  1. package/.github/workflows/ci-cd.yml +1 -1
  2. package/docs/.nojekyll +0 -0
  3. package/docs/README.md +44 -0
  4. package/docs/demo.bundle.js +1708 -0
  5. package/docs/index.html +536 -0
  6. package/eslint.config.js +1 -1
  7. package/package.json +5 -1
  8. package/docs/api/BrowserApi.html +0 -2662
  9. package/docs/api/BrowserApiError.html +0 -669
  10. package/docs/api/ConfigurationError.html +0 -745
  11. package/docs/api/CsvFormatError.html +0 -677
  12. package/docs/api/CsvParsingError.html +0 -511
  13. package/docs/api/CsvToJson.html +0 -3367
  14. package/docs/api/CsvToJsonAsync.html +0 -2880
  15. package/docs/api/FileOperationError.html +0 -382
  16. package/docs/api/FileUtils.html +0 -1150
  17. package/docs/api/InputValidationError.html +0 -407
  18. package/docs/api/JsonUtil.html +0 -452
  19. package/docs/api/JsonValidationError.html +0 -357
  20. package/docs/api/StringUtils.html +0 -833
  21. package/docs/api/global.html +0 -3498
  22. package/docs/api/index.html +0 -414
  23. package/docs/api/index.js.html +0 -447
  24. package/docs/api/scripts/app.min.js +0 -1
  25. package/docs/api/scripts/linenumber.js +0 -26
  26. package/docs/api/scripts/search.js +0 -39
  27. package/docs/api/src_browserApi.js.html +0 -362
  28. package/docs/api/src_csvToJson.js.html +0 -696
  29. package/docs/api/src_csvToJsonAsync.js.html +0 -335
  30. package/docs/api/src_util_errors.js.html +0 -472
  31. package/docs/api/src_util_fileUtils.js.html +0 -238
  32. package/docs/api/src_util_jsonUtils.js.html +0 -166
  33. package/docs/api/src_util_stringUtils.js.html +0 -306
  34. package/docs/api/styles/app.min.css +0 -1
  35. package/docs/api/styles/iframe.css +0 -13
  36. package/docs/api/styles/prettify-jsdoc.css +0 -111
  37. package/docs/api/styles/prettify-tomorrow.css +0 -132
  38. package/docs/api/styles/reset.css +0 -44
@@ -0,0 +1,536 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+
4
+ <head>
5
+ <meta charset="UTF-8">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+ <title>CSV to JSON Demo</title>
8
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.1.3/css/bootstrap.min.css">
9
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/ionicons/2.0.1/css/ionicons.min.css">
10
+ <link rel="stylesheet" href="assets/css/style.css">
11
+ <style>
12
+ body {
13
+ font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
14
+ margin: 0;
15
+ padding: 20px;
16
+ background-color: #f8f9fa;
17
+ color: #333;
18
+ }
19
+
20
+ .container {
21
+ max-width: 1200px;
22
+ margin: 0 auto;
23
+ background: white;
24
+ border-radius: 8px;
25
+ box-shadow: 0 2px 20px rgba(0, 0, 0, 0.1);
26
+ overflow: hidden;
27
+ }
28
+
29
+ .header {
30
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
31
+ color: white;
32
+ padding: 30px;
33
+ text-align: center;
34
+ }
35
+
36
+ .header h1 {
37
+ margin: 0;
38
+ font-size: 2.5em;
39
+ font-weight: 300;
40
+ }
41
+
42
+ .header p {
43
+ margin: 10px 0 0 0;
44
+ opacity: 0.9;
45
+ font-size: 1.1em;
46
+ }
47
+
48
+ .content {
49
+ padding: 30px;
50
+ }
51
+
52
+ .input-section {
53
+ margin-bottom: 30px;
54
+ }
55
+
56
+ .tabs {
57
+ display: flex;
58
+ margin-bottom: 20px;
59
+ border-bottom: 1px solid #dee2e6;
60
+ }
61
+
62
+ .tab {
63
+ padding: 12px 24px;
64
+ background: none;
65
+ border: none;
66
+ cursor: pointer;
67
+ font-size: 16px;
68
+ border-bottom: 3px solid transparent;
69
+ transition: all 0.3s;
70
+ color: #495057;
71
+ }
72
+
73
+ .tab:hover {
74
+ background-color: #f8f9fa;
75
+ color: #212529;
76
+ }
77
+
78
+ .tab.active {
79
+ border-bottom-color: #007bff;
80
+ color: #007bff;
81
+ font-weight: 500;
82
+ }
83
+
84
+ .tab-content {
85
+ display: none;
86
+ }
87
+
88
+ .tab-content.active {
89
+ display: block;
90
+ }
91
+
92
+ label {
93
+ display: block;
94
+ margin-bottom: 8px;
95
+ font-weight: 600;
96
+ color: #495057;
97
+ }
98
+
99
+ textarea,
100
+ input[type="file"] {
101
+ width: 100%;
102
+ padding: 12px;
103
+ border: 2px solid #dee2e6;
104
+ border-radius: 6px;
105
+ font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
106
+ font-size: 14px;
107
+ line-height: 1.4;
108
+ transition: border-color 0.3s;
109
+ }
110
+
111
+ textarea:focus,
112
+ input[type="file"]:focus {
113
+ outline: none;
114
+ border-color: #007bff;
115
+ }
116
+
117
+ textarea {
118
+ height: 200px;
119
+ resize: vertical;
120
+ }
121
+
122
+ .file-info {
123
+ margin-top: 10px;
124
+ padding: 8px 12px;
125
+ background-color: #e9ecef;
126
+ border-radius: 4px;
127
+ font-size: 14px;
128
+ display: none;
129
+ }
130
+
131
+ .samples {
132
+ margin-top: 15px;
133
+ }
134
+
135
+ .sample-btn {
136
+ background: #6c757d;
137
+ color: white;
138
+ border: none;
139
+ padding: 8px 16px;
140
+ margin-right: 10px;
141
+ margin-bottom: 10px;
142
+ border-radius: 4px;
143
+ cursor: pointer;
144
+ font-size: 14px;
145
+ transition: background-color 0.3s;
146
+ }
147
+
148
+ .sample-btn:hover {
149
+ background: #5a6268;
150
+ }
151
+
152
+ .options {
153
+ background-color: #f8f9fa;
154
+ padding: 20px;
155
+ border-radius: 8px;
156
+ margin-bottom: 30px;
157
+ border: 1px solid #dee2e6;
158
+ }
159
+
160
+ .options h3 {
161
+ margin-top: 0;
162
+ color: #495057;
163
+ font-size: 1.2em;
164
+ }
165
+
166
+ .option-group {
167
+ display: inline-block;
168
+ margin-right: 30px;
169
+ margin-bottom: 15px;
170
+ }
171
+
172
+ .option-group label {
173
+ display: inline;
174
+ margin-right: 8px;
175
+ font-weight: normal;
176
+ cursor: pointer;
177
+ }
178
+
179
+ input[type="checkbox"],
180
+ input[type="number"],
181
+ input[type="text"] {
182
+ margin-right: 5px;
183
+ }
184
+
185
+ .buttons {
186
+ text-align: center;
187
+ margin-bottom: 30px;
188
+ }
189
+
190
+ button {
191
+ background: linear-gradient(135deg, #007bff 0%, #0056b3 100%);
192
+ color: white;
193
+ border: none;
194
+ padding: 12px 30px;
195
+ border-radius: 6px;
196
+ cursor: pointer;
197
+ font-size: 16px;
198
+ font-weight: 500;
199
+ margin: 0 10px;
200
+ transition: all 0.3s;
201
+ box-shadow: 0 2px 4px rgba(0, 123, 255, 0.2);
202
+ }
203
+
204
+ button:hover {
205
+ transform: translateY(-1px);
206
+ box-shadow: 0 4px 8px rgba(0, 123, 255, 0.3);
207
+ }
208
+
209
+ button:disabled {
210
+ background: #6c757d;
211
+ cursor: not-allowed;
212
+ transform: none;
213
+ box-shadow: none;
214
+ }
215
+
216
+ .output {
217
+ display: block;
218
+ }
219
+
220
+ .output.hidden {
221
+ display: none;
222
+ }
223
+
224
+ .output-tabs {
225
+ display: flex;
226
+ margin-bottom: 20px;
227
+ border-bottom: 1px solid #dee2e6;
228
+ }
229
+
230
+ .output-tab {
231
+ padding: 10px 20px;
232
+ background: none;
233
+ border: none;
234
+ cursor: pointer;
235
+ font-size: 16px;
236
+ border-bottom: 3px solid transparent;
237
+ transition: all 0.3s;
238
+ color: #495057;
239
+ }
240
+
241
+ .output-tab:hover {
242
+ background-color: #f8f9fa;
243
+ }
244
+
245
+ .output-tab.active {
246
+ border-bottom-color: #28a745;
247
+ color: #28a745;
248
+ font-weight: 500;
249
+ }
250
+
251
+ .output-content {
252
+ display: none;
253
+ }
254
+
255
+ .output-content.active {
256
+ display: block;
257
+ }
258
+
259
+ .json-output,
260
+ .table-output {
261
+ background-color: #f8f9fa;
262
+ border: 1px solid #dee2e6;
263
+ border-radius: 6px;
264
+ padding: 20px;
265
+ font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
266
+ font-size: 14px;
267
+ line-height: 1.4;
268
+ max-height: 500px;
269
+ overflow-y: auto;
270
+ white-space: pre-wrap;
271
+ }
272
+
273
+ .table-output table {
274
+ width: 100%;
275
+ border-collapse: collapse;
276
+ background: white;
277
+ }
278
+
279
+ .table-output th,
280
+ .table-output td {
281
+ padding: 8px 12px;
282
+ text-align: left;
283
+ border-bottom: 1px solid #dee2e6;
284
+ }
285
+
286
+ .table-output th {
287
+ background-color: #e9ecef;
288
+ font-weight: 600;
289
+ }
290
+
291
+ .stats-output {
292
+ background-color: #e9ecef;
293
+ padding: 15px;
294
+ border-radius: 6px;
295
+ margin-bottom: 20px;
296
+ display: flex;
297
+ gap: 20px;
298
+ }
299
+
300
+ .stats-output p {
301
+ margin: 0;
302
+ font-weight: 500;
303
+ }
304
+
305
+ .error-output {
306
+ display: none;
307
+ background-color: #f8d7da;
308
+ color: #721c24;
309
+ padding: 15px;
310
+ border-radius: 6px;
311
+ border: 1px solid #f5c6cb;
312
+ margin-bottom: 20px;
313
+ }
314
+
315
+ .error-output:not(.hidden) {
316
+ display: block;
317
+ }
318
+
319
+ .download-btn {
320
+ margin-top: 1rem;
321
+ background: #28a745;
322
+ margin-left: 10px;
323
+ }
324
+
325
+ .download-btn:hover {
326
+ background: #218838;
327
+ }
328
+
329
+ .hidden {
330
+ display: none !important;
331
+ }
332
+
333
+ .github-link {
334
+ color: unset;
335
+ text-decoration: none;
336
+ }
337
+
338
+ .footer-basic {
339
+ position: fixed;
340
+ left: 0;
341
+ bottom: 0;
342
+ width: 100%;
343
+ margin-top: 1rem;
344
+ padding-top: 1rem;
345
+ padding-bottom: 0.3rem;
346
+ background-color: #ffffff;
347
+ color: #4b4c4d;
348
+ }
349
+
350
+ .footer-basic ul {
351
+ padding: 0;
352
+ list-style: none;
353
+ text-align: center;
354
+ font-size: 18px;
355
+ line-height: 1.6;
356
+ margin-bottom: 0;
357
+ }
358
+
359
+ .footer-basic li {
360
+ padding: 0 10px;
361
+ }
362
+
363
+ .footer-basic ul a {
364
+ color: inherit;
365
+ text-decoration: none;
366
+ opacity: 0.8;
367
+ }
368
+
369
+ .footer-basic ul a:hover {
370
+ opacity: 1;
371
+ }
372
+
373
+ .footer-basic .social {
374
+ text-align: center;
375
+ padding-top: 1rem;
376
+ }
377
+
378
+ .footer-basic .social>a {
379
+ font-size: 24px;
380
+ width: 40px;
381
+ height: 40px;
382
+ line-height: 40px;
383
+ display: inline-block;
384
+ text-align: center;
385
+ border-radius: 50%;
386
+ border: 1px solid #ccc;
387
+ margin: 0 8px;
388
+ color: inherit;
389
+ opacity: 0.75;
390
+ }
391
+
392
+ .footer-basic .social>a:hover {
393
+ opacity: 0.9;
394
+ }
395
+
396
+ .footer-basic .copyright {
397
+ margin-top: 15px;
398
+ text-align: center;
399
+ font-size: 13px;
400
+ color: #aaa;
401
+ margin-bottom: 0;
402
+ }
403
+
404
+ @media (max-width: 768px) {
405
+ .content {
406
+ padding: 20px;
407
+ }
408
+
409
+ .option-group {
410
+ display: block;
411
+ margin-right: 0;
412
+ }
413
+
414
+ .stats-output {
415
+ flex-direction: column;
416
+ gap: 10px;
417
+ }
418
+ }
419
+ </style>
420
+ </head>
421
+
422
+ <body>
423
+ <div class="container">
424
+ <div class="header">
425
+ <h1>CSV to JSON Converter</h1>
426
+ <p>Convert CSV files to JSON with <b>no dependencies</b>. Supports Node.js (Sync & Async), and Browser
427
+ environments with full RFC 4180 compliance.</p>
428
+ </div>
429
+
430
+ <div class="content">
431
+ <div class="tabs">
432
+ <button class="tab active" data-tab="text">Paste CSV</button>
433
+ <button class="tab" data-tab="file">Upload File</button>
434
+ </div>
435
+
436
+ <div id="text-tab" class="tab-content active">
437
+ <div class="input-section">
438
+ <label for="csv-input">CSV Input:</label>
439
+ <textarea id="csv-input" placeholder="Paste your CSV data here...
440
+
441
+ Example:
442
+ name,age,city
443
+ John,25,New York
444
+ Jane,30,London"></textarea>
445
+ <div class="samples">
446
+ <label>Try a sample:</label><br>
447
+ <button class="sample-btn" data-sample="basic">Basic CSV</button>
448
+ <button class="sample-btn" data-sample="quoted">Quoted Fields</button>
449
+ <button class="sample-btn" data-sample="numbers">Numbers</button>
450
+ <button class="sample-btn" data-sample="dates">Dates</button>
451
+ </div>
452
+ </div>
453
+ </div>
454
+
455
+ <div id="file-tab" class="tab-content">
456
+ <div class="input-section">
457
+ <label for="csv-file">CSV File:</label>
458
+ <input type="file" id="csv-file" accept=".csv,text/csv">
459
+ <div id="file-info" class="file-info"></div>
460
+ </div>
461
+ </div>
462
+
463
+ <div class="options">
464
+ <h3>Parsing Options</h3>
465
+ <div class="option-group">
466
+ <input type="checkbox" id="format-values" checked>
467
+ <label for="format-values">Format values by type</label>
468
+ </div>
469
+ <div class="option-group">
470
+ <input type="checkbox" id="quoted-fields">
471
+ <label for="quoted-fields">Support quoted fields</label>
472
+ </div>
473
+ <div class="option-group">
474
+ <label for="delimiter">Field Delimiter:</label>
475
+ <input type="text" id="delimiter" value="," size="1">
476
+ </div>
477
+ <div class="option-group">
478
+ <label for="header-index">Header Row Index:</label>
479
+ <input type="number" id="header-index" value="0" min="0" size="2">
480
+ </div>
481
+ </div>
482
+
483
+ <div class="buttons">
484
+ <button id="convert-btn">Convert to JSON</button>
485
+ <button id="clear-btn">Clear</button>
486
+ </div>
487
+
488
+ <div id="output" class="output hidden">
489
+ <div id="error-output" class="error-output hidden"></div>
490
+
491
+ <div class="stats-output" id="stats-output"></div>
492
+
493
+ <div class="output-tabs">
494
+ <button class="output-tab active" data-output="table">Table View</button>
495
+ <button class="output-tab" data-output="json">JSON View</button>
496
+ </div>
497
+
498
+ <div id="table-content" class="output-content active">
499
+ <div class="table-output" id="table-output"></div>
500
+ </div>
501
+
502
+ <div id="json-content" class="output-content">
503
+ <div class="json-output" id="json-output"></div>
504
+ <button class="download-btn" onclick="downloadJSON()">Download JSON</button>
505
+ </div>
506
+ </div>
507
+ </div>
508
+ </div>
509
+
510
+ <div class="footer-basic">
511
+ <footer>
512
+ <ul class="list-inline">
513
+ <li class="list-inline-item">
514
+ <a href="https://github.com/iuccio/csvToJson">
515
+ <?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
516
+ <svg fill="#000000" width="24px" height="24px" viewBox="0 0 24 24"
517
+ xmlns="http://www.w3.org/2000/svg">
518
+ <path
519
+ d="m12.301 0h.093c2.242 0 4.34.613 6.137 1.68l-.055-.031c1.871 1.094 3.386 2.609 4.449 4.422l.031.058c1.04 1.769 1.654 3.896 1.654 6.166 0 5.406-3.483 10-8.327 11.658l-.087.026c-.063.02-.135.031-.209.031-.162 0-.312-.054-.433-.144l.002.001c-.128-.115-.208-.281-.208-.466 0-.005 0-.01 0-.014v.001q0-.048.008-1.226t.008-2.154c.007-.075.011-.161.011-.249 0-.792-.323-1.508-.844-2.025.618-.061 1.176-.163 1.718-.305l-.076.017c.573-.16 1.073-.373 1.537-.642l-.031.017c.508-.28.938-.636 1.292-1.058l.006-.007c.372-.476.663-1.036.84-1.645l.009-.035c.209-.683.329-1.468.329-2.281 0-.045 0-.091-.001-.136v.007c0-.022.001-.047.001-.072 0-1.248-.482-2.383-1.269-3.23l.003.003c.168-.44.265-.948.265-1.479 0-.649-.145-1.263-.404-1.814l.011.026c-.115-.022-.246-.035-.381-.035-.334 0-.649.078-.929.216l.012-.005c-.568.21-1.054.448-1.512.726l.038-.022-.609.384c-.922-.264-1.981-.416-3.075-.416s-2.153.152-3.157.436l.081-.02q-.256-.176-.681-.433c-.373-.214-.814-.421-1.272-.595l-.066-.022c-.293-.154-.64-.244-1.009-.244-.124 0-.246.01-.364.03l.013-.002c-.248.524-.393 1.139-.393 1.788 0 .531.097 1.04.275 1.509l-.01-.029c-.785.844-1.266 1.979-1.266 3.227 0 .025 0 .051.001.076v-.004c-.001.039-.001.084-.001.13 0 .809.12 1.591.344 2.327l-.015-.057c.189.643.476 1.202.85 1.693l-.009-.013c.354.435.782.793 1.267 1.062l.022.011c.432.252.933.465 1.46.614l.046.011c.466.125 1.024.227 1.595.284l.046.004c-.431.428-.718 1-.784 1.638l-.001.012c-.207.101-.448.183-.699.236l-.021.004c-.256.051-.549.08-.85.08-.022 0-.044 0-.066 0h.003c-.394-.008-.756-.136-1.055-.348l.006.004c-.371-.259-.671-.595-.881-.986l-.007-.015c-.198-.336-.459-.614-.768-.827l-.009-.006c-.225-.169-.49-.301-.776-.38l-.016-.004-.32-.048c-.023-.002-.05-.003-.077-.003-.14 0-.273.028-.394.077l.007-.003q-.128.072-.08.184c.039.086.087.16.145.225l-.001-.001c.061.072.13.135.205.19l.003.002.112.08c.283.148.516.354.693.603l.004.006c.191.237.359.505.494.792l.01.024.16.368c.135.402.38.738.7.981l.005.004c.3.234.662.402 1.057.478l.016.002c.33.064.714.104 1.106.112h.007c.045.002.097.002.15.002.261 0 .517-.021.767-.062l-.027.004.368-.064q0 .609.008 1.418t.008.873v.014c0 .185-.08.351-.208.466h-.001c-.119.089-.268.143-.431.143-.075 0-.147-.011-.214-.032l.005.001c-4.929-1.689-8.409-6.283-8.409-11.69 0-2.268.612-4.393 1.681-6.219l-.032.058c1.094-1.871 2.609-3.386 4.422-4.449l.058-.031c1.739-1.034 3.835-1.645 6.073-1.645h.098-.005zm-7.64 17.666q.048-.112-.112-.192-.16-.048-.208.032-.048.112.112.192.144.096.208-.032zm.497.545q.112-.08-.032-.256-.16-.144-.256-.048-.112.08.032.256.159.157.256.047zm.48.72q.144-.112 0-.304-.128-.208-.272-.096-.144.08 0 .288t.272.112zm.672.673q.128-.128-.064-.304-.192-.192-.32-.048-.144.128.064.304.192.192.32.044zm.913.4q.048-.176-.208-.256-.24-.064-.304.112t.208.24q.24.097.304-.096zm1.009.08q0-.208-.272-.176-.256 0-.256.176 0 .208.272.176.256.001.256-.175zm.929-.16q-.032-.176-.288-.144-.256.048-.224.24t.288.128.225-.224z" />
520
+ </svg>
521
+ </a>
522
+ </li>
523
+ <li class="list-inline-item"><a href="https://github.com/iuccio/csvToJson/blob/master/README.md">Documentation</a></li>
524
+ <li class="list-inline-item"><a href="https://www.npmjs.com/package/convert-csv-to-json">npm</a></li>
525
+ <li class="list-inline-item"><a href="./api/index.html">JSDoc</a></li>
526
+ <li class="list-inline-item"><a href="https://github.com/iuccio">About</a></li>
527
+ </ul>
528
+ </footer>
529
+ </div>
530
+
531
+ <script src="demo.bundle.js"></script>
532
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js" integrity="sha384-xBuQ/xzmlsLoJpyjoggmTEz8OWUFM0/RC5BsqQBDX2v5cMvDHcMakNTNrHIW2I5f" crossorigin="anonymous"></script>
533
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.1.3/js/bootstrap.bundle.min.js" integrity="sha384-pjaaA8dDz/5BgdFUPX6M/9SUZv4d12SUPF0axWc+VRZkx5xU3daN+lYb49+Ax+Tl" crossorigin="anonymous"></script>
534
+ </body>
535
+
536
+ </html>
package/eslint.config.js CHANGED
@@ -60,7 +60,7 @@ const sharedGlobals = {
60
60
 
61
61
  module.exports = [
62
62
  {
63
- ignores: ['node_modules', 'coverage', 'docs', '.eslintignore'],
63
+ ignores: ['node_modules', 'coverage', 'docs', '.eslintignore', 'demo'],
64
64
  },
65
65
  {
66
66
  files: ['**/*.js'],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "convert-csv-to-json",
3
- "version": "4.14.0",
3
+ "version": "4.16.0",
4
4
  "description": "Convert CSV to JSON",
5
5
  "main": "index.js",
6
6
  "types": "index.d.ts",
@@ -10,6 +10,9 @@
10
10
  "lint": "eslint .",
11
11
  "docs": "jsdoc -c jsdoc.json",
12
12
  "docs:api": "jsdoc -c jsdoc.json -d docs/api",
13
+ "build:browser": "browserify src/browserApi.js -o dist/csvToJson.browser.js --standalone csvToJson",
14
+ "build:demo": "npm run build:all",
15
+ "build:all": "npm run build:browser && npm run build:demo",
13
16
  "prepublishOnly": "npm run docs:api",
14
17
  "version-patch": "npm version patch",
15
18
  "version-minor": "npm version minor",
@@ -52,6 +55,7 @@
52
55
  "@eslint/js": "^10.0.1",
53
56
  "@types/jest": "^30.0.0",
54
57
  "better-docs": "^2.7.3",
58
+ "browserify": "^17.0.1",
55
59
  "eslint": "^10.1.0",
56
60
  "eslint-plugin-jsdoc": "^62.8.0",
57
61
  "jest": "^30.2.0",