scanoss 0.8.2 → 0.8.3

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.
@@ -0,0 +1,1181 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+
4
+ <head>
5
+ <meta charset="UTF-8">
6
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
7
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
8
+ <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet"
9
+ integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
10
+ <title>SCANOSS Detected Report</title>
11
+ </head>
12
+
13
+ <style>
14
+ @import url('https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@300;400;500;600;700&display=swap');
15
+
16
+ :root {
17
+ --primary: #6366F1;
18
+ --dark: #18181B;
19
+ --bg-color: rgba(241, 245, 249, 1);
20
+ }
21
+
22
+ body {
23
+ max-width: 1200px;
24
+ margin: 0 auto;
25
+ background: var(--bg-color);
26
+ color: var(--dark);
27
+ font-family: 'Space Grotesk', sans-serif;
28
+ }
29
+
30
+
31
+ .nav-link {
32
+ display: none;
33
+ }
34
+
35
+ .nav-link.visible {
36
+ display: inline-block;
37
+ }
38
+
39
+ header {
40
+ display: flex;
41
+ flex-direction: column;
42
+ }
43
+
44
+ footer {
45
+ font-size: 12px;
46
+ color: gray;
47
+ }
48
+
49
+ .header-title {
50
+ display: flex;
51
+ flex-direction: row;
52
+ justify-content: space-between;
53
+ width: 100%;
54
+ margin-top: 15px;
55
+ margin-bottom: 16px;
56
+ }
57
+
58
+ .project-name-container {
59
+ display: flex;
60
+ justify-content: center;
61
+ align-items: center;
62
+ font-size: 48px;
63
+ }
64
+
65
+ .header-title img {
66
+ height: 55px;
67
+ }
68
+
69
+ h1,
70
+ h2,
71
+ h3,
72
+ h4,
73
+ h5 {
74
+ color: #656df1;
75
+ font-weight: 400;
76
+ }
77
+
78
+ .primary {
79
+ color: var(--primary) !important;
80
+ }
81
+
82
+ #date {
83
+ margin-top: 0;
84
+ color: darkgray;
85
+ font-size: 14px;
86
+ }
87
+
88
+ .divider {
89
+ border-bottom: 1px solid rgba(228, 228, 231, 1);
90
+ margin: 10px 0;
91
+ }
92
+
93
+ .divider.big {
94
+ margin: 25px 0;
95
+ }
96
+
97
+ .text-center {
98
+ text-align: center;
99
+ }
100
+
101
+ .main-container {
102
+ width: 100%;
103
+ }
104
+
105
+ .scan-summary {
106
+ display: flex;
107
+ justify-content: center;
108
+ gap: 15px;
109
+ }
110
+
111
+ .license-table-container {
112
+ width: 100%;
113
+ height: 700px;
114
+ display: flex;
115
+ flex-direction: row;
116
+ justify-content: center;
117
+ align-items: flex-start;
118
+ padding-left: 4%;
119
+ padding-right: 7%;
120
+ }
121
+
122
+ .pie-chart-container {
123
+ margin: 0 auto;
124
+ }
125
+
126
+
127
+ .incompatible-license-table td:first-child {
128
+ text-align: left;
129
+ font-size: 14px;
130
+ font-weight: 500;
131
+ line-height: 20px;
132
+ letter-spacing: 0em;
133
+ text-align: left;
134
+ color: var(--dark);
135
+ }
136
+
137
+ .incompatible-license-table th {
138
+ font-size: 18px;
139
+ font-weight: 400;
140
+ line-height: 23px;
141
+ color: #A1A1AA;
142
+ border-color: #E4E4E7;
143
+ }
144
+
145
+ .incompatible-license-table th:first-child {
146
+ text-align: left;
147
+ }
148
+
149
+ .table td,
150
+ .table th {
151
+ padding: 0.15rem;
152
+ text-align: center;
153
+ vertical-align: middle;
154
+ }
155
+
156
+ table {
157
+ width: 100%;
158
+ }
159
+
160
+ th {
161
+ font-size: 13px;
162
+ font-weight: bold;
163
+ }
164
+
165
+ tr {
166
+ font-size: 11px;
167
+ }
168
+
169
+ .color-reference {
170
+ width: 15px;
171
+ height: 15px;
172
+ display: block;
173
+ border-radius: 2px;
174
+ }
175
+
176
+
177
+ .table-striped tbody tr:nth-of-type(odd) {
178
+ background-color: rgb(105 101 101 / 5%);
179
+ }
180
+
181
+
182
+
183
+ .button-solid {
184
+ border: none;
185
+ background-color: transparent;
186
+ margin-right: 0;
187
+ padding: 10px 0 10px 10px;
188
+ color: #656df1;
189
+ font-size: 12px;
190
+ font-weight: 600;
191
+ line-height: 15px;
192
+ letter-spacing: 0em;
193
+ text-align: right;
194
+ }
195
+
196
+
197
+ .button-solid:focus,
198
+ #drop-down-license-detail-btn:focus {
199
+ border: none;
200
+ outline: none;
201
+ }
202
+
203
+ .hide {
204
+ display: none;
205
+ }
206
+
207
+
208
+ .label {
209
+ display: flex;
210
+ justify-content: left;
211
+ align-items: center;
212
+ width: 100%;
213
+ color: rgb(0 0 0 / 51%);
214
+ }
215
+
216
+ p {
217
+ margin-top: 0;
218
+ margin-bottom: 0;
219
+ text-align: left;
220
+ }
221
+
222
+ .drop-down-license-detail-container button {
223
+ display: flex;
224
+ justify-content: center;
225
+ width: 100%;
226
+ }
227
+
228
+ .license-info-detail {
229
+ display: flex;
230
+ justify-content: space-around;
231
+ width: 100%;
232
+ padding: 6px 0;
233
+ }
234
+
235
+ .license-ref {
236
+ width: 90%;
237
+ display: flex;
238
+ }
239
+
240
+ .license-component-button-container {
241
+ width: 40%;
242
+ display: flex;
243
+ align-items: center;
244
+ justify-content: flex-end;
245
+ }
246
+
247
+ .license-info-container {
248
+ display: flex;
249
+ width: 85%;
250
+ }
251
+
252
+ .color-reference-container {
253
+ width: 14%;
254
+ align-items: center;
255
+ justify-content: center;
256
+ display: flex;
257
+ }
258
+
259
+ .info-container {
260
+ display: flex;
261
+ justify-content: center;
262
+ align-items: center;
263
+ width: 85%;
264
+ height: 30px;
265
+ }
266
+
267
+ .info {
268
+ display: flex;
269
+ flex-direction: column;
270
+ width: 100%;
271
+ }
272
+
273
+ .info.big {
274
+ width: auto;
275
+ margin: 0 15px;
276
+ }
277
+
278
+ .info.big .label {
279
+ font-weight: 400;
280
+ font-size: 20px;
281
+ color: rgb(113, 113, 122);
282
+ justify-content: center;
283
+ }
284
+
285
+ .info.big .value {
286
+ font-weight: 600;
287
+ font-size: 64px;
288
+ line-height: 64px;
289
+ justify-content: center;
290
+ }
291
+
292
+ .info .label {
293
+ display: flex;
294
+ justify-content: flex-start;
295
+ width: 100%;
296
+ }
297
+
298
+ .info .value {
299
+ display: flex;
300
+ justify-content: flex-start;
301
+ text-align: left;
302
+ width: 100%;
303
+ color: rgb(24, 24, 27);
304
+ font-size: 16px;
305
+ font-weight: 500;
306
+ line-height: 26px;
307
+
308
+ }
309
+
310
+ .info .value.small {
311
+ font-size: 16px;
312
+ font-weight: 400;
313
+ line-height: 20px;
314
+ color: rgb(24, 24, 27)
315
+ }
316
+
317
+ .row-license-info-container {
318
+ display: flex;
319
+ width: 100%;
320
+ }
321
+
322
+ td.cell-info-container {
323
+ width: 30%;
324
+ display: flex;
325
+ }
326
+
327
+ td.cell-info-container:last-child {
328
+ justify-content: right;
329
+ }
330
+
331
+ td.cell-info-container:last-child {
332
+ justify-content: right;
333
+ }
334
+
335
+ td.cell-info-container.index {
336
+ width: 10%;
337
+
338
+ }
339
+
340
+ .row-info-container {
341
+ display: flex;
342
+ justify-content: center;
343
+ align-items: center;
344
+ }
345
+
346
+ .detected-license-report-table-container,
347
+ .incompatibilities-table-container {
348
+ margin: 0px;
349
+ }
350
+
351
+ .incompatible-license-container {
352
+ margin: 10px 0;
353
+ min-height: 20px;
354
+ align-items: center;
355
+ }
356
+
357
+ .license-block {
358
+ margin: 2px;
359
+ font-size: 12px;
360
+ background-color: #dfdedd;
361
+ display: flex;
362
+ flex-flow: wrap;
363
+ justify-content: center;
364
+ align-items: center;
365
+ padding: 5px;
366
+ border-radius: 3px;
367
+ font-weight: bold;
368
+
369
+ -webkit-print-color-adjust: exact !important;
370
+
371
+ }
372
+
373
+ .incompatible-license-container {
374
+ display: flex;
375
+ flex-flow: wrap;
376
+ flex-direction: row;
377
+ }
378
+
379
+ #incompatible-license {
380
+ vertical-align: baseline;
381
+ border-top: 1px solid #fafafa;
382
+ }
383
+
384
+ .incompatible-ref {
385
+ background-color: #dc3545;
386
+ color: white;
387
+ -webkit-print-color-adjust: exact !important;
388
+ }
389
+
390
+ table.main-table>thead {
391
+ position: sticky;
392
+ top: 0;
393
+ background: var(--bg-color);
394
+ }
395
+
396
+ table.main-table td,
397
+ table.main-table th {
398
+ text-align: left;
399
+ }
400
+
401
+ .table.main-table>:not(:first-child) {
402
+ border-top: 0 !important;
403
+ }
404
+
405
+ table.main-table th {
406
+ padding: .5rem;
407
+ font-size: 18px;
408
+ font-weight: 400;
409
+ line-height: 23px;
410
+ color: #A1A1AA;
411
+ border-color: #E4E4E7;
412
+ }
413
+
414
+
415
+ table.main-table td {
416
+ padding: .5rem;
417
+ vertical-align: top;
418
+ font-size: 14px;
419
+ font-weight: 400;
420
+ line-height: 20px;
421
+ letter-spacing: 0em;
422
+ text-align: left;
423
+ color: var(--dark);
424
+ }
425
+
426
+ table.main-table tr.subheader {
427
+ position: sticky;
428
+ top: 36px;
429
+ }
430
+
431
+ table.main-table tr.subheader td {
432
+ background-color: #efeff5;
433
+ font-size: 12px;
434
+ font-weight: 600;
435
+ color: rgb(40, 40, 43)
436
+ }
437
+
438
+ table.main-table td:first-child {
439
+ font-weight: 600;
440
+ }
441
+ </style>
442
+
443
+ <body>
444
+ <header>
445
+ <div class="header-title">
446
+ <img
447
+ src="data:image/png;base64,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">
448
+ <div>
449
+ <h5>Detected Report</h5>
450
+ <h5 id="date"></h5>
451
+ </div>
452
+ </div>
453
+ <section class="project-name-container">
454
+ <h1 id='project-name'></h1>
455
+ </section>
456
+ <div class="divider mt-3 mb-5"></div>
457
+
458
+ <div class="scan-summary"></div>
459
+
460
+ <div class="divider mt-5"></div>
461
+ </header>
462
+
463
+
464
+ <nav>
465
+ <div class="nav nav-pills d-flex justify-content-center mb-5" id="nav-tab" role="tablist">
466
+ <button class="nav-link active" id="nav-licenses-tab" data-bs-toggle="tab" data-bs-target="#nav-licenses"
467
+ type="button" role="tab" aria-controls="nav-licenses" aria-selected="true">Licenses</button>
468
+ <button class="nav-link" id="nav-components-tab" data-bs-toggle="tab" data-bs-target="#nav-components"
469
+ type="button" role="tab" aria-controls="nav-components" aria-selected="false">Components</button>
470
+ <button class="nav-link" id="nav-vulnerabilities-tab" data-bs-toggle="tab" data-bs-target="#nav-vulnerabilities"
471
+ type="button" role="tab" aria-controls="nav-vulnerabilities" aria-selected="false">Vulnerabilities</button>
472
+ <button class="nav-link" id="nav-dependencies-tab" data-bs-toggle="tab" data-bs-target="#nav-dependencies"
473
+ type="button" role="tab" aria-controls="nav-dependencies" aria-selected="false">Dependencies</button>
474
+ <button class="nav-link" id="nav-copyrights-tab" data-bs-toggle="tab" data-bs-target="#nav-copyrights"
475
+ type="button" role="tab" aria-controls="nav-copyrights" aria-selected="false">Copyrights</button>
476
+ <button class="nav-link" id="nav-cryptography-tab" data-bs-toggle="tab" data-bs-target="#nav-cryptography"
477
+ type="button" role="tab" aria-controls="nav-cryptography" aria-selected="false">Cryptography</button>
478
+ <button class="nav-link" id="nav-quality-tab" data-bs-toggle="tab" data-bs-target="#nav-quality"
479
+ type="button" role="tab" aria-controls="nav-quality" aria-selected="false">Quality</button>
480
+ <button class="nav-link" id="nav-health-tab" data-bs-toggle="tab" data-bs-target="#nav-health"
481
+ type="button" role="tab" aria-controls="nav-health" aria-selected="false">Health</button>
482
+ <button class="nav-link" id="nav-summary-tab" data-bs-toggle="tab" data-bs-target="#nav-summary" type="button"
483
+ role="tab" aria-controls="nav-summary" aria-selected="false">Summary</button>
484
+ </div>
485
+ </nav>
486
+
487
+
488
+ <main class="main-container">
489
+
490
+ <div class="tab-content" id="nav-tabContent">
491
+
492
+ <!-- licenses -->
493
+ <div class="tab-pane fade show active" id="nav-licenses" role="tabpanel" aria-labelledby="nav-licenses-tab"
494
+ tabindex="0">
495
+ <section class="mt-5">
496
+ <div class="pie-chart-container">
497
+ <div>
498
+ <canvas id="myChart"></canvas>
499
+ </div>
500
+ </div>
501
+ </section>
502
+ <section class="mt-5">
503
+ <div class="detected-license-report-table-container">
504
+ <table class="table">
505
+ <tbody id="body-license-detail-table">
506
+ </tbody>
507
+ </table>
508
+ </div>
509
+ </section>
510
+ <section class="mt-5">
511
+ <h4>License obligations</h4>
512
+ <div class="incompatibilities-table-container">
513
+ <table class="table incompatible-license-table main-table">
514
+ <thead>
515
+ <tr>
516
+ <th>License</th>
517
+ <th>Copyleft</th>
518
+ <th>Incompatible Licenses</th>
519
+ </tr>
520
+ </thead>
521
+ <tbody id="incompatible-license">
522
+ </tbody>
523
+ </table>
524
+ </div>
525
+ </section>
526
+ </div>
527
+
528
+ <!-- components -->
529
+ <section class="tab-pane fade" id="nav-components" role="tabpanel" aria-labelledby="nav-components-tab"
530
+ tabindex="0">
531
+ <table id="table-components" class="table main-table">
532
+ <thead>
533
+ <tr>
534
+ <th>Component</th>
535
+ <th>PURL</th>
536
+ <th>Detected Versions</th>
537
+ <th>URL</th>
538
+ </tr>
539
+ </thead>
540
+ <tbody>
541
+ </tbody>
542
+ </table>
543
+
544
+ <template id="tpl-component-row">
545
+ <tr>
546
+ <td></td>
547
+ <td></td>
548
+ <td></td>
549
+ <td></td>
550
+ </tr>
551
+ </template>
552
+ </section>
553
+
554
+ <!-- vulnerabilities -->
555
+ <section class="tab-pane fade" id="nav-vulnerabilities" role="tabpanel" aria-labelledby="nav-vulnerabilities-tab"
556
+ tabindex="0">
557
+ <table id="table-vulnerabilities" class="table main-table">
558
+ <thead>
559
+ <tr>
560
+ <th>Component</th>
561
+ <th>Version</th>
562
+ <th>CVE</th>
563
+ <th>Severity</th>
564
+ <th>Published</th>
565
+ <th>Patched</th>
566
+ <th>Summary</th>
567
+ </tr>
568
+ </thead>
569
+ <tbody>
570
+ </tbody>
571
+ </table>
572
+
573
+ <template id="tpl-vulnerabilities-row">
574
+ <tr>
575
+ <td></td>
576
+ <td></td>
577
+ <td></td>
578
+ <td></td>
579
+ <td></td>
580
+ <td></td>
581
+ <td></td>
582
+ </tr>
583
+ </template>
584
+ </section>
585
+
586
+ <!-- dependencies -->
587
+ <section class="tab-pane fade" id="nav-dependencies" role="tabpanel" aria-labelledby="nav-dependencies-tab"
588
+ tabindex="0">
589
+ <table id="table-dependencies" class="table main-table">
590
+ <thead>
591
+ <tr>
592
+ <th>Dependency</th>
593
+ <th>PURL</th>
594
+ <th>Version</th>
595
+ <th>License</th>
596
+ </tr>
597
+ </thead>
598
+ <tbody>
599
+ </tbody>
600
+ </table>
601
+
602
+ <template id="tpl-dependencies-row">
603
+ <tr>
604
+ <td></td>
605
+ <td></td>
606
+ <td></td>
607
+ <td></td>
608
+ </tr>
609
+ </template>
610
+ </section>
611
+
612
+ <!-- copyright -->
613
+ <section class="tab-pane fade" id="nav-copyrights" role="tabpanel" aria-labelledby="nav-copyrights-tab"
614
+ tabindex="0">
615
+ <table id="table-copyrights" class="table main-table">
616
+ <thead>
617
+ <tr>
618
+ <th>Component</th>
619
+ <th>Version</th>
620
+ <th>Copyright</th>
621
+ </tr>
622
+ </thead>
623
+ <tbody>
624
+ </tbody>
625
+ </table>
626
+
627
+ <template id="tpl-copyrights-row">
628
+ <tr>
629
+ <td></td>
630
+ <td></td>
631
+ <td></td>
632
+ </tr>
633
+ </template>
634
+ </section>
635
+
636
+ <!-- cryptography -->
637
+ <section class="tab-pane fade" id="nav-cryptography" role="tabpanel" aria-labelledby="nav-cryptography-tab"
638
+ tabindex="0">
639
+ <table id="table-cryptography" class="table main-table">
640
+ <thead>
641
+ <tr>
642
+ <th>Component</th>
643
+ <th>Version</th>
644
+ <th>Cryptography</th>
645
+ </tr>
646
+ </thead>
647
+ <tbody>
648
+ </tbody>
649
+ </table>
650
+
651
+ <template id="tpl-cryptography-row">
652
+ <tr>
653
+ <td></td>
654
+ <td></td>
655
+ <td></td>
656
+ </tr>
657
+ </template>
658
+ </section>
659
+
660
+ <!-- quality -->
661
+ <section class="tab-pane fade" id="nav-quality" role="tabpanel" aria-labelledby="nav-quality-tab"
662
+ tabindex="0">
663
+ <table id="table-quality" class="table main-table">
664
+ <thead>
665
+ <tr>
666
+ <th>Component</th>
667
+ <th>Version</th>
668
+ <th>Quality</th>
669
+ </tr>
670
+ </thead>
671
+ <tbody>
672
+ </tbody>
673
+ </table>
674
+
675
+ <template id="tpl-quality-row">
676
+ <tr>
677
+ <td></td>
678
+ <td></td>
679
+ <td></td>
680
+ </tr>
681
+ </template>
682
+ </section>
683
+
684
+ <!-- health -->
685
+ <section class="tab-pane fade" id="nav-health" role="tabpanel" aria-labelledby="nav-health-tab"
686
+ tabindex="0">
687
+ <table id="table-health" class="table main-table">
688
+ <thead>
689
+ <tr>
690
+ <th>Component</th>
691
+ <th>PURL</th>
692
+ <th>Creation Date</th>
693
+ <th>Issues</th>
694
+ <th>Last Push</th>
695
+ <th>Last Update</th>
696
+ <th>Watchers</th>
697
+ <th>Country</th>
698
+ <th>Forks</th>
699
+ </tr>
700
+ </thead>
701
+ <tbody>
702
+ </tbody>
703
+ </table>
704
+
705
+ <template id="tpl-health-row">
706
+ <tr>
707
+ <td></td>
708
+ <td></td>
709
+ <td></td>
710
+ <td></td>
711
+ <td></td>
712
+ <td></td>
713
+ <td></td>
714
+ <td></td>
715
+ <td></td>
716
+ </tr>
717
+ </template>
718
+ </section>
719
+
720
+ <!-- summary -->
721
+ <div class="tab-pane fade" id="nav-summary" role="tabpanel" aria-labelledby="nav-summary-tab" tabindex="0">
722
+ SUMMARY
723
+ </div>
724
+ </div>
725
+ </main>
726
+
727
+ <div class="divider mt-5"></div>
728
+
729
+ <footer class="mb-2 text-center">
730
+ <p class="text-center">Reported generated by <a href="https://github.com/scanoss/scanoss.js"
731
+ target="_blank">scanoss.js</a></p>
732
+ <p class="text-center"><a href="https://www.scanoss.com" target="_blank">www.scanoss.com</a></p>
733
+ </footer>
734
+
735
+ <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.1/dist/js/bootstrap.bundle.min.js"
736
+ integrity="sha384-u1OknCvxWvY5kfmNBILK2hRnQC3Pr17a+RTT6rIHI7NnikvbZlHgTPOOmMi466C8"
737
+ crossorigin="anonymous"></script>
738
+ <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
739
+ <script>
740
+ addEventListener('DOMContentLoaded', (event) => {
741
+ const entryData = '#DATA';
742
+ const data = JSON.parse(entryData);
743
+ let pieChartDataEntry = {
744
+ labels: [],
745
+ components: []
746
+ };
747
+
748
+ data.licenses.forEach((l) => {
749
+ pieChartDataEntry.labels.push(l.label);
750
+ pieChartDataEntry.components.push(l.value);
751
+ });
752
+
753
+ const color = [
754
+ '#E8B34B',
755
+ '#E22C2C',
756
+ '#5754D0',
757
+ '#9F69C0',
758
+ '#FE7F10',
759
+ '#E56399',
760
+ '#E637BF',
761
+ '#474647',
762
+ '#153243',
763
+ '#2DE1C2',
764
+ '#F05365',
765
+ '#A2D729',
766
+ '#3C91E6',
767
+ '#FA824C',
768
+ '#C94277',
769
+ '#E56B6F',
770
+ '#F71735',
771
+ '#011627',
772
+ '#724E91',
773
+ '#7D451B',
774
+ '#9BE564',
775
+ ];
776
+
777
+ function init() {
778
+
779
+ setupNavigation();
780
+
781
+ renderHeader();
782
+ renderLicensesTable();
783
+ renderComponentTable();
784
+ renderDependenciesTable();
785
+ renderVulnerabilitiesTable();
786
+ renderCopyrightTable();
787
+ renderCryptographyTable();
788
+ renderQualityTable();
789
+ renderHealthTable();
790
+ }
791
+
792
+ init();
793
+
794
+ function setupNavigation(componentList) {
795
+ const showTab = (id) => document.querySelector('.nav-link#' + id).classList.add('visible');
796
+
797
+ const existVersionKey = (key, componentList) => {
798
+ for (const component of componentList) {
799
+ for (const version of component.versions) {
800
+ if (version && version[key]) return true;
801
+ }
802
+ }
803
+ return false;
804
+ };
805
+
806
+
807
+ const existComponentKey = (key, componentList) => {
808
+ for (const component of componentList) {
809
+ if (component[key]) return true;
810
+ }
811
+ return false;
812
+ };
813
+
814
+
815
+ if (data.licenses) showTab('nav-licenses-tab');
816
+ if (data.component) showTab('nav-components-tab');
817
+ if (data.dependencies) showTab('nav-dependencies-tab');
818
+ if (data.vulnerabilities) showTab('nav-vulnerabilities-tab');
819
+ if (existVersionKey('copyrights', data.component)) showTab('nav-copyrights-tab');
820
+ if (existVersionKey('cryptography', data.component)) showTab('nav-cryptography-tab');
821
+ if (existVersionKey('quality', data.component)) showTab('nav-quality-tab');
822
+ if (existComponentKey('health', data.component)) showTab('nav-health-tab');
823
+ }
824
+
825
+ function renderHeader() {
826
+
827
+ // date
828
+ const d = document.querySelector('#date');
829
+ d.innerHTML += new Date(data.summary.timestamp).toLocaleDateString();
830
+
831
+ // project name
832
+ const p = document.querySelector('#project-name');
833
+ p.innerHTML += data.summary.projectName ? data.summary.projectName : '-';
834
+
835
+
836
+ // summary
837
+ const s = document.querySelector('.scan-summary');
838
+ s.innerHTML += `
839
+ <div class="info big">
840
+ <div class="value primary">${data.summary.totalFiles}</div>
841
+ <div class="label">Files Scanned</div>
842
+ </div>
843
+ <div class="info big">
844
+ <div class="value">${data.summary.matchedFiles}</div>
845
+ <div class="label">Matched</div>
846
+ </div>
847
+ <div class="info big">
848
+ <div class="value">${data.summary.noMatchFiles}</div>
849
+ <div class="label">No Matches</div>
850
+ </div>
851
+ `;
852
+ }
853
+
854
+ function renderLicensesTable() {
855
+
856
+ function dropDown(id) {
857
+ const nodes = document.getElementsByClassName(id);
858
+ for (let i = 0; i < nodes.length; i += 1) {
859
+ if (nodes[i].classList.contains('hide')) {
860
+ nodes[i].classList.remove('hide');
861
+ nodes[i].classList.add('show');
862
+ } else {
863
+ nodes[i].classList.remove('show');
864
+ nodes[i].classList.add('hide');
865
+ }
866
+ }
867
+ }
868
+
869
+ function addButtonListener() {
870
+ const btn = document.querySelectorAll('.button-solid');
871
+ btn.forEach((button) => {
872
+ button.addEventListener('click', (event) => {
873
+ dropDown(event.target.id);
874
+ });
875
+ });
876
+ }
877
+
878
+ function pieChart() {
879
+ const data = {
880
+ labels: pieChartDataEntry.labels,
881
+ datasets: [
882
+ {
883
+ backgroundColor: color,
884
+ borderColor: 'rgb(255, 255, 255)',
885
+ data: pieChartDataEntry.components,
886
+ },
887
+ ],
888
+ };
889
+ const config = {
890
+ type: 'doughnut',
891
+ data,
892
+ options: {
893
+ responsive: true,
894
+ maintainAspectRatio: false,
895
+ elements: {
896
+ arc: {
897
+ borderWidth: 1,
898
+ },
899
+ },
900
+ plugins: {
901
+ legend: {
902
+ display: true,
903
+ position: 'right',
904
+ },
905
+ },
906
+ },
907
+ };
908
+ const myChart = new Chart(document.getElementById('myChart'), config);
909
+ }
910
+
911
+ function licenseDetail() {
912
+ const body = document.querySelector('#body-license-detail-table');
913
+ data.licenses.forEach((l, index) => {
914
+ body.innerHTML += `
915
+ <tr>
916
+ <td>
917
+ <div class="license-info-detail">
918
+ <div class="license-ref">
919
+ <div class="license-info-container">
920
+ <div class="info-container">
921
+ <div class="info">
922
+ <div class="label">
923
+ License
924
+ </div>
925
+ <div class="value">
926
+ ${l.label}
927
+ </div>
928
+ </div>
929
+ </div>
930
+ </div>
931
+ </div>
932
+ <div class="license-component-button-container">
933
+ <button class="button-solid" id="${l.label}"> ${l.value} component found &#x25BC</button>
934
+ </div>
935
+ </div>
936
+ </td>
937
+ </tr>`;
938
+
939
+ body.innerHTML += `<tr class="${l.label} hide">
940
+ <td colspan="2">
941
+ <table>
942
+ ${l.components.map((c, index) => {
943
+ return `<tr class="row-license-info-container">
944
+ <td class="cell-info-container index">
945
+ <div class="row-info-container">
946
+ <div class="info">
947
+ <div class="value small">
948
+ ${index + 1}
949
+ </div>
950
+ </div>
951
+ </div>
952
+ </td>
953
+ <td class="cell-info-container">
954
+ <div class="row-info-container">
955
+ <div class="info">
956
+ <div class="label">
957
+ Component
958
+ </div>
959
+ <div class="value small">
960
+ ${c.name}
961
+ </div>
962
+ </div>
963
+ </div>
964
+ </td>
965
+ <td class="cell-info-container">
966
+ <div class="row-info-container">
967
+ <div class="info">
968
+ <div class="label">
969
+ Purl
970
+ </div>
971
+ <div class="value small">
972
+ ${decodeURIComponent(c.purl)}
973
+ </div>
974
+ </div>
975
+ </div>
976
+ </td>
977
+ <td class="cell-info-container">
978
+ <div class="row-info-container">
979
+ <div class="info">
980
+ <div class="label">
981
+ ${c.versions.length > 1 ? 'Versions' : 'Version'}
982
+ </div>
983
+ <div class="value small">
984
+ ${c.versions.toString()}
985
+ </div>
986
+ </div>
987
+ </div>
988
+ </td>
989
+ </tr>`
990
+ }).join(' ')}
991
+ </table>
992
+ </td>
993
+ </tr>`;
994
+ });
995
+
996
+ addButtonListener();
997
+ }
998
+
999
+ function incompatibleLicenses() {
1000
+ const licenseMapper = new Set();
1001
+ data.licenses.forEach((l) => licenseMapper.add(l.label));
1002
+ const body = document.querySelector('#incompatible-license');
1003
+ data.licenses.forEach((l) => {
1004
+ body.innerHTML += `
1005
+ <tr>
1006
+ <td>${l.label}</td>
1007
+ <td>${l.copyleft === true ? '&#10004' : '&#10006'}</td>
1008
+ <td><div class="incompatible-license-container">${l.incompatibleWith.map((i) => {
1009
+ return `<div class="license-block ${licenseMapper.has(i) === true ? 'incompatible-ref' : ''}">
1010
+ <p>${i}</p>
1011
+ </div>`;
1012
+ }).join(' ')}</div></td>
1013
+ </tr>`;
1014
+ });
1015
+ }
1016
+
1017
+ pieChart();
1018
+ licenseDetail();
1019
+ incompatibleLicenses()
1020
+
1021
+ }
1022
+
1023
+ function renderComponentTable() {
1024
+ const template = document.querySelector("#tpl-component-row");
1025
+ const table = document.querySelector("#table-components tbody");
1026
+
1027
+ const { component: componentData } = data;
1028
+
1029
+ if (!componentData) return false;
1030
+
1031
+ for (const component of componentData) {
1032
+ const clon = template.content.cloneNode(true);
1033
+ clon.querySelector('td:nth-child(1)').innerHTML = component.name;
1034
+ clon.querySelector('td:nth-child(2)').innerHTML = decodeURIComponent(component.key);
1035
+ clon.querySelector('td:nth-child(3)').innerHTML = component.versions?.map(item => item.version).join(', ');
1036
+ clon.querySelector('td:nth-child(4)').innerHTML = component.url ? `<a href="${component.url}" target="_blank">${decodeURIComponent(component.url)}</a>` : '-';
1037
+ table.appendChild(clon);
1038
+ }
1039
+ }
1040
+
1041
+ function renderDependenciesTable() {
1042
+ const template = document.querySelector("#tpl-dependencies-row");
1043
+ const table = document.querySelector("#table-dependencies tbody");
1044
+
1045
+ const { dependencies: dependencyData } = data;
1046
+
1047
+ if (!dependencyData) return false;
1048
+
1049
+ for (const depData of dependencyData) {
1050
+ table.innerHTML += `<tr class="subheader"> <td colspan='4'> ${depData.dependencies?.length} ${depData.dependencies?.length == 1 ? 'dependency' : 'dependencies'} found in <span class="primary">${depData.file}</span> </td> </tr>`;
1051
+ for (const dependency of depData.dependencies) {
1052
+ const clon = template.content.cloneNode(true);
1053
+ clon.querySelector('td:nth-child(1)').innerHTML = dependency.component || '-';
1054
+ clon.querySelector('td:nth-child(2)').innerHTML = decodeURIComponent(dependency.purl);
1055
+ clon.querySelector('td:nth-child(3)').innerHTML = dependency.version;
1056
+ clon.querySelector('td:nth-child(4)').innerHTML = dependency.licenses?.map(item => item.name).join(', ');
1057
+ table.appendChild(clon);
1058
+ }
1059
+ }
1060
+ };
1061
+
1062
+ function renderVulnerabilitiesTable() {
1063
+ const template = document.querySelector("#tpl-vulnerabilities-row");
1064
+ const table = document.querySelector("#table-vulnerabilities tbody");
1065
+
1066
+ const { vulnerabilities: vulnerabilityData } = data;
1067
+
1068
+ if (!vulnerabilityData) return false;
1069
+
1070
+ for (const purlVulData of vulnerabilityData) {
1071
+ for (const vulnerabilty of purlVulData.vulnerability) {
1072
+ const clon = template.content.cloneNode(true);
1073
+ clon.querySelector('td:nth-child(1)').innerHTML = decodeURIComponent(purlVulData.purl);
1074
+ clon.querySelector('td:nth-child(2)').innerHTML = "-";
1075
+ clon.querySelector('td:nth-child(3)').innerHTML = vulnerabilty.cve;
1076
+ clon.querySelector('td:nth-child(4)').innerHTML = vulnerabilty.severity;
1077
+ clon.querySelector('td:nth-child(5)').innerHTML = vulnerabilty.published;
1078
+ clon.querySelector('td:nth-child(6)').innerHTML = vulnerabilty.modified;
1079
+ clon.querySelector('td:nth-child(7)').innerHTML = vulnerabilty.summary;
1080
+ table.appendChild(clon);
1081
+ }
1082
+
1083
+ }
1084
+ }
1085
+
1086
+
1087
+ function renderCopyrightTable() {
1088
+ const template = document.querySelector("#tpl-copyrights-row");
1089
+ const table = document.querySelector("#table-copyrights tbody");
1090
+
1091
+ const { component: componentData } = data;
1092
+
1093
+ if (!componentData) return false;
1094
+
1095
+ for (const compData of componentData) {
1096
+ for (const version of compData.versions) {
1097
+ if (!version.copyrights) continue
1098
+ const clon = template.content.cloneNode(true);
1099
+ clon.querySelector('td:nth-child(1)').innerHTML = compData.name;
1100
+ clon.querySelector('td:nth-child(2)').innerHTML = version.version;
1101
+ clon.querySelector('td:nth-child(3)').innerHTML = version.copyrights?.map(item => item.name).join(' - ');
1102
+
1103
+ table.appendChild(clon);
1104
+ }
1105
+ }
1106
+ }
1107
+
1108
+ function renderCryptographyTable() {
1109
+ const template = document.querySelector("#tpl-cryptography-row");
1110
+ const table = document.querySelector("#table-cryptography tbody");
1111
+
1112
+ const { component: componentData } = data;
1113
+
1114
+ if (!componentData) return false;
1115
+
1116
+ for (const compData of componentData) {
1117
+ for (const version of compData.versions) {
1118
+ if (!version.cryptography) continue
1119
+ const clon = template.content.cloneNode(true);
1120
+ clon.querySelector('td:nth-child(1)').innerHTML = compData.name;
1121
+ clon.querySelector('td:nth-child(2)').innerHTML = version.version;
1122
+ clon.querySelector('td:nth-child(3)').innerHTML = version.cryptography.map(e => `${e.algorithm} (${e.strength})`).join('');
1123
+
1124
+ table.appendChild(clon);
1125
+ }
1126
+ }
1127
+ }
1128
+
1129
+ function renderQualityTable() {
1130
+ const template = document.querySelector("#tpl-quality-row");
1131
+ const table = document.querySelector("#table-quality tbody");
1132
+
1133
+ const { component: componentData } = data;
1134
+
1135
+ if (!componentData) return false;
1136
+
1137
+ for (const compData of componentData) {
1138
+ for (const version of compData.versions) {
1139
+ if (!version.quality) continue
1140
+ const clon = template.content.cloneNode(true);
1141
+ clon.querySelector('td:nth-child(1)').innerHTML = compData.name;
1142
+ clon.querySelector('td:nth-child(2)').innerHTML = version.version;
1143
+ clon.querySelector('td:nth-child(3)').innerHTML = version.quality.scoreAvg + "/5";
1144
+
1145
+ table.appendChild(clon);
1146
+ }
1147
+ }
1148
+ }
1149
+
1150
+ function renderHealthTable() {
1151
+ const template = document.querySelector("#tpl-health-row");
1152
+ const table = document.querySelector("#table-health tbody");
1153
+
1154
+ const { component: componentData } = data;
1155
+
1156
+ if (!componentData) return false;
1157
+
1158
+ for (const compData of componentData) {
1159
+ if (!compData.health) continue
1160
+ const clon = template.content.cloneNode(true);
1161
+ clon.querySelector('td:nth-child(1)').innerHTML = compData.name;
1162
+ clon.querySelector('td:nth-child(2)').innerHTML = compData.key;
1163
+ clon.querySelector('td:nth-child(3)').innerHTML = compData.health.creation_date || '-';
1164
+ clon.querySelector('td:nth-child(4)').innerHTML = compData.health.issues || '-';
1165
+ clon.querySelector('td:nth-child(5)').innerHTML = compData.health.last_push || '-';
1166
+ clon.querySelector('td:nth-child(6)').innerHTML = compData.health.last_update || '-';
1167
+ clon.querySelector('td:nth-child(7)').innerHTML = compData.health.watchers || '-';
1168
+ clon.querySelector('td:nth-child(8)').innerHTML = compData.health.country || '-';
1169
+ clon.querySelector('td:nth-child(9)').innerHTML = compData.health.forks || '-';
1170
+
1171
+ table.appendChild(clon);
1172
+ }
1173
+ }
1174
+ });
1175
+ </script>
1176
+
1177
+
1178
+
1179
+ </body>
1180
+
1181
+ </html>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "scanoss",
3
- "version": "0.8.2",
3
+ "version": "0.8.3",
4
4
  "description": "The SCANOSS JS package provides a simple, easy to consume module for interacting with SCANOSS APIs/Engine.",
5
5
  "main": "build/main/index.js",
6
6
  "typings": "build/main/index.d.ts",
@@ -76,6 +76,7 @@
76
76
  "files": [
77
77
  "build/main",
78
78
  "build/module",
79
+ "assets/",
79
80
  "!**/*.spec.*",
80
81
  "!**/*.json",
81
82
  "CHANGELOG.md",