scanoss 0.13.0 → 0.13.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +4 -0
- package/assets/ReportHTMLTemplate/index.html +82 -37
- package/build/main/cli/commands/crypto.js +5 -2
- package/build/main/cli/commands/scan.js +3 -1
- package/build/main/sdk/Report/DataLayer/DataLayerTypes.d.ts +13 -0
- package/build/main/sdk/Report/DataLayer/DataProviderManager.js +2 -1
- package/build/main/sdk/Report/DataLayer/DataProviders/CryptographyDataProvider.d.ts +14 -0
- package/build/main/sdk/Report/DataLayer/DataProviders/CryptographyDataProvider.js +54 -0
- package/build/main/sdk/tree/File.d.ts +1 -1
- package/build/main/sdk/tree/File.js +3 -2
- package/build/main/sdk/tree/Filters/BinaryFilter.d.ts +5 -0
- package/build/main/sdk/tree/Filters/BinaryFilter.js +10 -0
- package/build/main/sdk/tree/Filters/FilterAND.d.ts +7 -0
- package/build/main/sdk/tree/Filters/FilterAND.js +20 -0
- package/build/main/sdk/tree/Node.d.ts +2 -0
- package/build/main/sdk/tree/Node.js +5 -1
- package/build/main/sdk/tree/Tree.js +6 -3
- package/build/main/tsconfig.tsbuildinfo +71 -11
- package/build/module/cli/commands/crypto.js +5 -2
- package/build/module/cli/commands/scan.js +3 -1
- package/build/module/sdk/Report/DataLayer/DataLayerTypes.d.ts +13 -0
- package/build/module/sdk/Report/DataLayer/DataProviderManager.js +2 -1
- package/build/module/sdk/Report/DataLayer/DataProviders/CryptographyDataProvider.d.ts +14 -0
- package/build/module/sdk/Report/DataLayer/DataProviders/CryptographyDataProvider.js +51 -0
- package/build/module/sdk/tree/File.d.ts +1 -1
- package/build/module/sdk/tree/File.js +3 -2
- package/build/module/sdk/tree/Filters/BinaryFilter.d.ts +5 -0
- package/build/module/sdk/tree/Filters/BinaryFilter.js +7 -0
- package/build/module/sdk/tree/Filters/FilterAND.d.ts +7 -0
- package/build/module/sdk/tree/Filters/FilterAND.js +17 -0
- package/build/module/sdk/tree/Node.d.ts +2 -0
- package/build/module/sdk/tree/Node.js +5 -1
- package/build/module/sdk/tree/Tree.js +6 -3
- package/build/module/tsconfig.module.tsbuildinfo +71 -11
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
|
|
4
4
|
|
|
5
|
+
### [0.13.2](https://github.com/scanoss/scanoss.js/compare/v0.13.0...v0.13.1) (2024-05-20)
|
|
6
|
+
|
|
7
|
+
### [0.13.1](https://github.com/scanoss/scanoss.js/compare/v0.13.0...v0.13.1) (2024-05-15)
|
|
8
|
+
|
|
5
9
|
### [0.13.0](https://github.com/scanoss/scanoss.js/compare/v0.12.2...v0.13.0) (2024-05-13)
|
|
6
10
|
|
|
7
11
|
### [0.12.2](https://github.com/scanoss/scanoss.js/compare/v0.12.0...v0.12.2) (2024-05-10)
|
|
@@ -658,29 +658,61 @@
|
|
|
658
658
|
</template>
|
|
659
659
|
</section>
|
|
660
660
|
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
661
|
+
<!-- cryptography -->
|
|
662
|
+
<section aria-labelledby="nav-cryptography-tab" class="tab-pane fade" id="nav-cryptography" role="tabpanel"
|
|
663
|
+
tabindex="0">
|
|
664
|
+
<nav>
|
|
665
|
+
<div class="nav nav-tabs" id="nav-tab-crypto" role="tablist">
|
|
666
|
+
<button aria-controls="pane-local-cryptography" class="nav-link visible active" aria-selected="false" data-bs-target="#pane-local-cryptography"
|
|
667
|
+
data-bs-toggle="tab" id="crypto-file-tab" role="tab" type="button">Files</button>
|
|
668
|
+
<button aria-controls="pane-component-cryptography" class="nav-link visible" aria-selected="true" data-bs-target="#pane-component-cryptography"
|
|
669
|
+
data-bs-toggle="tab" id="crypto-component-tab" role="tab" type="button">Components</button>
|
|
670
|
+
</div>
|
|
671
|
+
</nav>
|
|
672
|
+
|
|
673
|
+
<div class="tab-content" id="myTabContent">
|
|
674
|
+
<div class="tab-pane" id="pane-component-cryptography" aria-labelledby="crypto-component-tab" role="tabpanel" tabindex="0">
|
|
675
|
+
<table class="table main-table" id="table-cryptography" >
|
|
676
|
+
<thead>
|
|
677
|
+
<tr>
|
|
678
|
+
<th>Component</th>
|
|
679
|
+
<th>Version</th>
|
|
680
|
+
<th>Cryptography</th>
|
|
681
|
+
</tr>
|
|
682
|
+
</thead>
|
|
683
|
+
<tbody>
|
|
684
|
+
</tbody>
|
|
685
|
+
</table>
|
|
686
|
+
|
|
687
|
+
<template id="tpl-cryptography-row">
|
|
688
|
+
<tr>
|
|
689
|
+
<td></td>
|
|
690
|
+
<td></td>
|
|
691
|
+
<td></td>
|
|
692
|
+
</tr>
|
|
693
|
+
</template>
|
|
694
|
+
</div>
|
|
695
|
+
<div class="tab-pane active" id="pane-local-cryptography" role="tabpanel" aria-labelledby="crypto-file-tab" tabindex="0">
|
|
696
|
+
<table class="table main-table" id="table-local-cryptography">
|
|
697
|
+
<thead>
|
|
698
|
+
<tr>
|
|
699
|
+
<th>File</th>
|
|
700
|
+
<th>Cryptography</th>
|
|
701
|
+
</tr>
|
|
702
|
+
</thead>
|
|
703
|
+
<tbody>
|
|
704
|
+
</tbody>
|
|
705
|
+
</table>
|
|
706
|
+
|
|
707
|
+
<template id="tpl-local-cryptography-row">
|
|
708
|
+
<tr>
|
|
709
|
+
<td></td>
|
|
710
|
+
<td></td>
|
|
711
|
+
</tr>
|
|
712
|
+
</template>
|
|
713
|
+
</div>
|
|
714
|
+
</div>
|
|
715
|
+
</section>
|
|
684
716
|
|
|
685
717
|
<!-- quality -->
|
|
686
718
|
<section aria-labelledby="nav-quality-tab" class="tab-pane fade" id="nav-quality" role="tabpanel"
|
|
@@ -809,7 +841,8 @@
|
|
|
809
841
|
renderDependenciesTable();
|
|
810
842
|
renderVulnerabilitiesTable();
|
|
811
843
|
renderCopyrightTable();
|
|
812
|
-
|
|
844
|
+
renderComponentCryptographyTable();
|
|
845
|
+
renderLocalCryptographyTable();
|
|
813
846
|
renderQualityTable();
|
|
814
847
|
renderHealthTable();
|
|
815
848
|
}
|
|
@@ -842,7 +875,7 @@
|
|
|
842
875
|
if (data.dependencies) showTab('nav-dependencies-tab');
|
|
843
876
|
if (data.vulnerabilities) showTab('nav-vulnerabilities-tab');
|
|
844
877
|
if (existVersionKey('copyrights', data.component)) showTab('nav-copyrights-tab');
|
|
845
|
-
if (
|
|
878
|
+
if (data.cryptography) showTab('nav-cryptography-tab');
|
|
846
879
|
if (existVersionKey('quality', data.component)) showTab('nav-quality-tab');
|
|
847
880
|
if (existComponentKey('health', data.component)) showTab('nav-health-tab');
|
|
848
881
|
}
|
|
@@ -1135,24 +1168,36 @@
|
|
|
1135
1168
|
}
|
|
1136
1169
|
}
|
|
1137
1170
|
|
|
1138
|
-
function
|
|
1171
|
+
function renderComponentCryptographyTable() {
|
|
1139
1172
|
const template = document.querySelector("#tpl-cryptography-row");
|
|
1140
1173
|
const table = document.querySelector("#table-cryptography tbody");
|
|
1141
1174
|
|
|
1142
|
-
const {
|
|
1175
|
+
const { cryptography } = data;
|
|
1143
1176
|
|
|
1144
|
-
if (!
|
|
1177
|
+
if (!cryptography && !cryptography.components) return false;
|
|
1145
1178
|
|
|
1146
|
-
for (const
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1179
|
+
for (const crypto of cryptography.components) {
|
|
1180
|
+
const clon = template.content.cloneNode(true);
|
|
1181
|
+
clon.querySelector('td:nth-child(1)').innerHTML = crypto.purl;
|
|
1182
|
+
clon.querySelector('td:nth-child(2)').innerHTML = crypto.version;
|
|
1183
|
+
clon.querySelector('td:nth-child(3)').innerHTML = crypto.algorithms.map(e => `${e.algorithm} (${e.strength})`).join(' - ');
|
|
1184
|
+
table.appendChild(clon);
|
|
1185
|
+
}
|
|
1186
|
+
}
|
|
1153
1187
|
|
|
1154
|
-
|
|
1155
|
-
|
|
1188
|
+
function renderLocalCryptographyTable(){
|
|
1189
|
+
const template = document.querySelector("#tpl-local-cryptography-row");
|
|
1190
|
+
const table = document.querySelector("#table-local-cryptography tbody");
|
|
1191
|
+
|
|
1192
|
+
const { cryptography } = data;
|
|
1193
|
+
|
|
1194
|
+
if (!cryptography && !cryptography.files) return false;
|
|
1195
|
+
|
|
1196
|
+
for (const crypto of cryptography.files) {
|
|
1197
|
+
const clon = template.content.cloneNode(true);
|
|
1198
|
+
clon.querySelector('td:nth-child(1)').innerHTML = crypto.file;
|
|
1199
|
+
clon.querySelector('td:nth-child(2)').innerHTML = crypto.algorithms.map(e => `${e.algorithm} (${e.strength})`).join(' - ');
|
|
1200
|
+
table.appendChild(clon);
|
|
1156
1201
|
}
|
|
1157
1202
|
}
|
|
1158
1203
|
|
|
@@ -8,6 +8,9 @@ const CryptographyScanner_1 = require("../../sdk/Cryptography/CryptographyScanne
|
|
|
8
8
|
const Tree_1 = require("../../sdk/tree/Tree");
|
|
9
9
|
const CryptoCfg_1 = require("../../sdk/Cryptography/CryptoCfg");
|
|
10
10
|
const fs_1 = __importDefault(require("fs"));
|
|
11
|
+
const BinaryFilter_1 = require("../../sdk/tree/Filters/BinaryFilter");
|
|
12
|
+
const ScanFilter_1 = require("../../sdk/tree/Filters/ScanFilter");
|
|
13
|
+
const FilterAND_1 = require("../../sdk/tree/Filters/FilterAND");
|
|
11
14
|
async function cryptoHandler(rootPath, options) {
|
|
12
15
|
rootPath = rootPath.replace(/\/$/, ''); // Remove trailing slash if exists
|
|
13
16
|
rootPath = rootPath.replace(/^\./, process.env.PWD); // Convert relative path to absolute path.
|
|
@@ -24,7 +27,7 @@ async function cryptoHandler(rootPath, options) {
|
|
|
24
27
|
if (pathIsFolder) {
|
|
25
28
|
const tree = new Tree_1.Tree(rootPath);
|
|
26
29
|
tree.build();
|
|
27
|
-
fileList = tree.getFileList(
|
|
30
|
+
fileList = tree.getFileList(new FilterAND_1.FilterAND([new BinaryFilter_1.BinaryFilter(), new ScanFilter_1.ScanFilter('')]));
|
|
28
31
|
}
|
|
29
32
|
console.log("Searching for local cryptography...");
|
|
30
33
|
const results = await cryptoScanner.scan(fileList);
|
|
@@ -37,4 +40,4 @@ async function cryptoHandler(rootPath, options) {
|
|
|
37
40
|
}
|
|
38
41
|
}
|
|
39
42
|
exports.cryptoHandler = cryptoHandler;
|
|
40
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
43
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3J5cHRvLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NsaS9jb21tYW5kcy9jcnlwdG8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSx1Q0FBcUM7QUFLckMsb0ZBRW9EO0FBQ3BELDhDQUEyQztBQUUzQyxnRUFBNkQ7QUFDN0QsNENBQW9CO0FBQ3BCLHNFQUFtRTtBQUNuRSxrRUFBK0Q7QUFDL0QsZ0VBQTZEO0FBR3RELEtBQUssVUFBVSxhQUFhLENBQUMsUUFBZ0IsRUFBRSxPQUFZO0lBQ2hFLFFBQVEsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFFLGtDQUFrQztJQUMzRSxRQUFRLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFFLDBDQUEwQztJQUNoRyxNQUFNLFlBQVksR0FBRyxNQUFNLGtCQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7SUFFOUMsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDO0lBQ3ZCLElBQUcsT0FBTyxDQUFDLEtBQUs7UUFBRSxXQUFXLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztJQUU5QyxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUM7SUFDbkIsSUFBRyxPQUFPLENBQUMsT0FBTztRQUFFLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDO0lBRTlDLE1BQU0sYUFBYSxHQUFHLElBQUkseUNBQW1CLENBQUMsSUFBSSxxQkFBUyxDQUFDLEVBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUMsQ0FBQyxDQUFDLENBQUM7SUFFaEcsSUFBSSxRQUFRLEdBQWtCLEVBQUUsQ0FBQztJQUNqQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBRXhCLElBQUksWUFBWSxFQUFFO1FBQ2hCLE1BQU0sSUFBSSxHQUFHLElBQUksV0FBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNiLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUkscUJBQVMsQ0FBQyxDQUFDLElBQUksMkJBQVksRUFBRSxFQUFFLElBQUksdUJBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUN0RjtJQUVELE9BQU8sQ0FBQyxHQUFHLENBQUMscUNBQXFDLENBQUMsQ0FBQTtJQUNsRCxNQUFNLE9BQU8sR0FBRyxNQUFNLGFBQWEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFFbkQsSUFBRyxPQUFPLENBQUMsTUFBTSxFQUFFO1FBQ2pCLE1BQU0sWUFBRSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5RSxPQUFPLENBQUMsR0FBRyxDQUFDLG9CQUFvQixPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztLQUNuRDtTQUFNO1FBQ0wsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUMvQztBQUVILENBQUM7QUFoQ0Qsc0NBZ0NDIn0=
|
|
@@ -24,6 +24,7 @@ const DecompressionFilter_1 = require("../../sdk/tree/Filters/DecompressionFilte
|
|
|
24
24
|
const DecompressionManager_1 = require("../../sdk/Decompress/DecompressionManager");
|
|
25
25
|
const path_1 = __importDefault(require("path"));
|
|
26
26
|
const LicenseObligationDataProvider_1 = require("../../sdk/Report/DataLayer/DataProviders/LicenseObligationDataProvider");
|
|
27
|
+
const CryptographyDataProvider_1 = require("../../sdk/Report/DataLayer/DataProviders/CryptographyDataProvider");
|
|
27
28
|
async function scanHandler(rootPath, options) {
|
|
28
29
|
rootPath = path_1.default.resolve(rootPath);
|
|
29
30
|
const pathIsFolder = await helpers_1.isFolder(rootPath);
|
|
@@ -147,6 +148,7 @@ async function scanHandler(rootPath, options) {
|
|
|
147
148
|
dataProviderManager.addDataProvider(new LicenseDataProvider_1.LicenseDataProvider(scannersResults.scanner, scannersResults.dependencies));
|
|
148
149
|
dataProviderManager.addDataProvider(new SummaryDataProvider_1.SummaryDataProvider(projectName, new Date(), scannersResults.scanner));
|
|
149
150
|
dataProviderManager.addDataProvider(new LicenseObligationDataProvider_1.LicenseObligationDataProvider(scannersResults.scanner, scannersResults.dependencies));
|
|
151
|
+
dataProviderManager.addDataProvider(new CryptographyDataProvider_1.CryptographyDataProvider(null, scannersResults.scanner));
|
|
150
152
|
const report = new Report_1.Report(dataProviderManager);
|
|
151
153
|
scannerResultsString = await report.getHTML();
|
|
152
154
|
}
|
|
@@ -156,4 +158,4 @@ async function scanHandler(rootPath, options) {
|
|
|
156
158
|
console.log(scannerResultsString);
|
|
157
159
|
}
|
|
158
160
|
exports.scanHandler = scanHandler;
|
|
159
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
161
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nhbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jbGkvY29tbWFuZHMvc2Nhbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDRDQUFvQjtBQUVwQix1REFBb0Q7QUFDcEQsaUVBTXdDO0FBQ3hDLDZEQUEwRDtBQUMxRCw4Q0FBMkM7QUFDM0MsZ0VBQXVDO0FBRXZDLHVDQUE2RDtBQUU3RCxzRkFBbUY7QUFDbkYsZ0ZBQTZFO0FBRTdFLGtFQUErRDtBQUMvRCw4RUFBMkU7QUFDM0Usb0RBQWlEO0FBQ2pELHdGQUFxRjtBQUNyRiwwR0FBdUc7QUFDdkcsNEdBQXlHO0FBQ3pHLHNHQUFtRztBQUNuRyxzR0FBbUc7QUFDbkcsb0ZBQWlGO0FBQ2pGLG9GQUFpRjtBQUNqRixnREFBd0I7QUFDeEIsMEhBQXVIO0FBQ3ZILGdIQUUyRTtBQUVwRSxLQUFLLFVBQVUsV0FBVyxDQUMvQixRQUFnQixFQUNoQixPQUFZO0lBRVosUUFBUSxHQUFHLGNBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7SUFFbEMsTUFBTSxZQUFZLEdBQUcsTUFBTSxrQkFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzlDLE1BQU0sV0FBVyxHQUFHLGdDQUFzQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBRXJELCtDQUErQztJQUMvQyxJQUFJLGVBQWUsR0FBa0IsRUFBRSxDQUFDO0lBQ3hDLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSwyQ0FBb0IsRUFBRSxDQUFDO0lBQ3hELElBQUksT0FBTyxDQUFDLE9BQU87UUFBRSxvQkFBb0IsQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQztJQUNwRSxJQUFJLE9BQU8sQ0FBQyxLQUFLO1FBQUUsb0JBQW9CLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUM7SUFDOUQsSUFBSSxPQUFPLENBQUMsR0FBRztRQUFFLG9CQUFvQixDQUFDLEdBQUcsR0FBRyxPQUFPLENB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
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { CryptoAlgorithm } from '../../Cryptography/CryptographyTypes';
|
|
2
|
+
import { CryptoItem } from '../../Cryptography/Scanneable/CryptoItem';
|
|
1
3
|
/************* Component interface definition *************/
|
|
2
4
|
export interface ComponentDataLayer {
|
|
3
5
|
key: string;
|
|
@@ -101,6 +103,16 @@ export interface SummaryDataLayer {
|
|
|
101
103
|
noMatchFiles: number;
|
|
102
104
|
totalFiles: number;
|
|
103
105
|
}
|
|
106
|
+
export interface ComponentCryptography {
|
|
107
|
+
purl: string;
|
|
108
|
+
version: string;
|
|
109
|
+
algorithms: Array<CryptoAlgorithm>;
|
|
110
|
+
}
|
|
111
|
+
/*********************** Files ****************************/
|
|
112
|
+
export interface CryptographyDataLayer {
|
|
113
|
+
files: Array<CryptoItem>;
|
|
114
|
+
components: Array<ComponentCryptography>;
|
|
115
|
+
}
|
|
104
116
|
export interface IDataLayers {
|
|
105
117
|
licenses: LicenseDataLayer[];
|
|
106
118
|
licensesObligations: LicenseObligation[];
|
|
@@ -108,6 +120,7 @@ export interface IDataLayers {
|
|
|
108
120
|
dependencies: DependencyDataLayer[];
|
|
109
121
|
vulnerabilities: VulnerabilityDataLayer[];
|
|
110
122
|
summary: SummaryDataLayer;
|
|
123
|
+
cryptography: CryptographyDataLayer;
|
|
111
124
|
}
|
|
112
125
|
export interface DataProvider {
|
|
113
126
|
getData(): Promise<IDataLayers>;
|
|
@@ -15,6 +15,7 @@ class DataProviderManager {
|
|
|
15
15
|
summary: null,
|
|
16
16
|
licenses: null,
|
|
17
17
|
licensesObligations: null,
|
|
18
|
+
cryptography: null,
|
|
18
19
|
};
|
|
19
20
|
for (const layer of this.dataLayersProviders)
|
|
20
21
|
Object.assign(dataLayer, await layer.getData());
|
|
@@ -22,4 +23,4 @@ class DataProviderManager {
|
|
|
22
23
|
}
|
|
23
24
|
}
|
|
24
25
|
exports.DataProviderManager = DataProviderManager;
|
|
25
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGF0YVByb3ZpZGVyTWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9zZGsvUmVwb3J0L0RhdGFMYXllci9EYXRhUHJvdmlkZXJNYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBRUEsTUFBYSxtQkFBbUI7SUFHOUI7UUFDRSxJQUFJLENBQUMsbUJBQW1CLEdBQUcsRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFFTSxlQUFlLENBQUMsQ0FBZTtRQUNwQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFTSxLQUFLLENBQUMsWUFBWTtRQUN2QixJQUFJLFNBQVMsR0FBZ0I7WUFDM0IsU0FBUyxFQUFFLElBQUk7WUFDZixZQUFZLEVBQUUsSUFBSTtZQUNsQixlQUFlLEVBQUUsSUFBSTtZQUNyQixPQUFPLEVBQUUsSUFBSTtZQUNiLFFBQVEsRUFBRSxJQUFJO1lBQ2QsbUJBQW1CLEVBQUUsSUFBSTtZQUN6QixZQUFZLEVBQUUsSUFBSTtTQUNuQixDQUFDO1FBRUYsS0FBSyxNQUFNLEtBQUssSUFBSSxJQUFJLENBQUMsbUJBQW1CO1lBQzFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLE1BQU0sS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDbEQsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztDQUNGO0FBMUJELGtEQTBCQyJ9
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { DataProvider, IDataLayers } from '../DataLayerTypes';
|
|
2
|
+
import { ScannerResults } from '../../../scanner/ScannerTypes';
|
|
3
|
+
import { ICryptoItem } from '../../../Cryptography/CryptographyTypes';
|
|
4
|
+
export declare class CryptographyDataProvider implements DataProvider {
|
|
5
|
+
private files;
|
|
6
|
+
private scanRawResults;
|
|
7
|
+
private componentList;
|
|
8
|
+
constructor(files: Array<ICryptoItem>, scanRawResults: ScannerResults);
|
|
9
|
+
getData(): Promise<IDataLayers>;
|
|
10
|
+
private getCrypto;
|
|
11
|
+
private normalizeAlgorithms;
|
|
12
|
+
private removeRepeatedAlgorithms;
|
|
13
|
+
getLayerName(): string;
|
|
14
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
2
|
+
exports.CryptographyDataProvider = void 0;
|
|
3
|
+
class CryptographyDataProvider {
|
|
4
|
+
constructor(files, scanRawResults) {
|
|
5
|
+
this.files = files;
|
|
6
|
+
this.scanRawResults = scanRawResults;
|
|
7
|
+
}
|
|
8
|
+
async getData() {
|
|
9
|
+
if (!this.files && !this.scanRawResults)
|
|
10
|
+
return { cryptography: null };
|
|
11
|
+
this.componentList = Object.values(this.scanRawResults).flat();
|
|
12
|
+
this.componentList = this.componentList.filter((component) => component.id !== 'none');
|
|
13
|
+
const componentCryptography = this.getCrypto(this.componentList);
|
|
14
|
+
return {
|
|
15
|
+
cryptography: {
|
|
16
|
+
files: this.files,
|
|
17
|
+
components: componentCryptography,
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
getCrypto(scanComponents) {
|
|
22
|
+
const componentCrypto = [];
|
|
23
|
+
scanComponents.forEach((c) => {
|
|
24
|
+
if (c.cryptography.length > 0) {
|
|
25
|
+
const crypto = {
|
|
26
|
+
purl: c.purl,
|
|
27
|
+
version: c.version,
|
|
28
|
+
algorithms: c.cryptography
|
|
29
|
+
};
|
|
30
|
+
componentCrypto.push(crypto);
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
return this.normalizeAlgorithms(componentCrypto);
|
|
34
|
+
}
|
|
35
|
+
normalizeAlgorithms(crypto) {
|
|
36
|
+
crypto.forEach((c) => {
|
|
37
|
+
c.algorithms = this.removeRepeatedAlgorithms(c.algorithms);
|
|
38
|
+
});
|
|
39
|
+
return crypto;
|
|
40
|
+
}
|
|
41
|
+
removeRepeatedAlgorithms(algorithms) {
|
|
42
|
+
const algorithmsMapper = new Map();
|
|
43
|
+
algorithms.forEach((a) => {
|
|
44
|
+
const algorithmToLowerCase = a.algorithm.toLowerCase();
|
|
45
|
+
algorithmsMapper.set(algorithmToLowerCase, Object.assign(Object.assign({}, a), { algorithm: algorithmToLowerCase }));
|
|
46
|
+
});
|
|
47
|
+
return Array.from(algorithmsMapper.values());
|
|
48
|
+
}
|
|
49
|
+
getLayerName() {
|
|
50
|
+
return '';
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
exports.CryptographyDataProvider = CryptographyDataProvider;
|
|
54
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ3J5cHRvZ3JhcGh5RGF0YVByb3ZpZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL3Nkay9SZXBvcnQvRGF0YUxheWVyL0RhdGFQcm92aWRlcnMvQ3J5cHRvZ3JhcGh5RGF0YVByb3ZpZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBZUEsTUFBYSx3QkFBd0I7SUFJbkMsWUFBWSxLQUF5QixFQUFJLGNBQThCO1FBQ3JFLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDO0lBQ3ZDLENBQUM7SUFDRCxLQUFLLENBQUMsT0FBTztRQUVYLElBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWM7WUFBRSxPQUFvQixFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQTtRQUVsRixJQUFJLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQy9ELElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQzVDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxLQUFLLE1BQU0sQ0FDdkMsQ0FBQztRQUVGLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFbEUsT0FBb0I7WUFDakIsWUFBWSxFQUFDO2dCQUNYLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztnQkFDakIsVUFBVSxFQUFFLHFCQUFxQjthQUNsQztTQUNILENBQUE7SUFDRixDQUFDO0lBRU8sU0FBUyxDQUFDLGNBQXVDO1FBQ3ZELE1BQU0sZUFBZSxHQUFHLEVBQUUsQ0FBQztRQUMzQixjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFDLEVBQUU7WUFDeEIsSUFBRyxDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUM7Z0JBQzNCLE1BQU0sTUFBTSxHQUFHO29CQUNiLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSTtvQkFDWixPQUFPLEVBQUUsQ0FBQyxDQUFDLE9BQU87b0JBQ2xCLFVBQVUsRUFBRSxDQUFDLENBQUMsWUFBWTtpQkFDM0IsQ0FBQTtnQkFDRCxlQUFlLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQzlCO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxlQUFlLENBQUMsQ0FBQTtJQUNsRCxDQUFDO0lBRU8sbUJBQW1CLENBQUMsTUFBb0M7UUFDOUQsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBQyxFQUFFO1lBQ2xCLENBQUMsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM3RCxDQUFDLENBQUMsQ0FBQTtRQUVGLE9BQU8sTUFBTSxDQUFDO0lBRWhCLENBQUM7SUFFTyx3QkFBd0IsQ0FBQyxVQUFrQztRQUNqRSxNQUFNLGdCQUFnQixHQUFHLElBQUksR0FBRyxFQUFtRCxDQUFDO1FBQ3BGLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUN2QixNQUFNLG9CQUFvQixHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDdkQsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLG9CQUFvQixrQ0FBTSxDQUFDLEtBQUUsU0FBUyxFQUFFLG9CQUFvQixJQUFFLENBQUE7UUFDckYsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQsWUFBWTtRQUNWLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztDQUNGO0FBL0RELDREQStEQyJ9
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import Node from './Node';
|
|
2
2
|
import { Filter } from './Filters/Filter';
|
|
3
3
|
export default class File extends Node {
|
|
4
|
-
constructor(name: string, path: string);
|
|
4
|
+
constructor(name: string, path: string, isBinaryFile: boolean);
|
|
5
5
|
getNode(path: string): Node;
|
|
6
6
|
getFiles(f?: Filter): Array<string>;
|
|
7
7
|
}
|
|
@@ -5,9 +5,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
5
5
|
const Node_1 = require("./Node");
|
|
6
6
|
const Node_2 = __importDefault(require("./Node"));
|
|
7
7
|
class File extends Node_2.default {
|
|
8
|
-
constructor(name, path) {
|
|
8
|
+
constructor(name, path, isBinaryFile) {
|
|
9
9
|
super(name, path);
|
|
10
10
|
this.type = Node_1.NodeType.FILE;
|
|
11
|
+
this.isBinaryFile = isBinaryFile;
|
|
11
12
|
}
|
|
12
13
|
getNode(path) {
|
|
13
14
|
if (path === this.getPath())
|
|
@@ -21,4 +22,4 @@ class File extends Node_2.default {
|
|
|
21
22
|
}
|
|
22
23
|
}
|
|
23
24
|
exports.default = File;
|
|
24
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmlsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zZGsvdHJlZS9GaWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxpQ0FBa0M7QUFDbEMsa0RBQTBCO0FBSTFCLE1BQXFCLElBQUssU0FBUSxjQUFJO0lBQ3BDLFlBQVksSUFBWSxFQUFFLElBQVksRUFBRSxZQUFxQjtRQUMzRCxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2xCLElBQUksQ0FBQyxJQUFJLEdBQUcsZUFBUSxDQUFDLElBQUksQ0FBQztRQUMxQixJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztJQUNuQyxDQUFDO0lBRU0sT0FBTyxDQUFDLElBQVk7UUFDekIsSUFBSSxJQUFJLEtBQUssSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3pDLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVNLFFBQVEsQ0FBQyxDQUFVO1FBQ3hCLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUN0QyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDMUIsQ0FBQztDQUVGO0FBakJELHVCQWlCQyJ9
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
2
|
+
exports.BinaryFilter = void 0;
|
|
3
|
+
const Filter_1 = require("./Filter");
|
|
4
|
+
class BinaryFilter extends Filter_1.Filter {
|
|
5
|
+
evaluate(node) {
|
|
6
|
+
return !node.isBinary();
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
exports.BinaryFilter = BinaryFilter;
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmluYXJ5RmlsdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3Nkay90cmVlL0ZpbHRlcnMvQmluYXJ5RmlsdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQ0EscUNBQWtDO0FBRWxDLE1BQWEsWUFBYSxTQUFRLGVBQU07SUFDN0IsUUFBUSxDQUFDLElBQVU7UUFDdkIsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMzQixDQUFDO0NBRUo7QUFMRCxvQ0FLQyJ9
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
2
|
+
exports.FilterAND = void 0;
|
|
3
|
+
const Filter_1 = require("./Filter");
|
|
4
|
+
class FilterAND extends Filter_1.Filter {
|
|
5
|
+
constructor(filters) {
|
|
6
|
+
super();
|
|
7
|
+
this.filters = filters;
|
|
8
|
+
}
|
|
9
|
+
evaluate(node) {
|
|
10
|
+
let valid = false;
|
|
11
|
+
for (let i = 0; i < this.filters.length; i++) {
|
|
12
|
+
valid = this.filters[i].evaluate(node);
|
|
13
|
+
if (!valid)
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
return valid;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
exports.FilterAND = FilterAND;
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmlsdGVyQU5ELmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3Nkay90cmVlL0ZpbHRlcnMvRmlsdGVyQU5ELnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQ0EscUNBQWtDO0FBRWxDLE1BQWEsU0FBVSxTQUFRLGVBQU07SUFJakMsWUFBWSxPQUFzQjtRQUM5QixLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxPQUFPLEdBQUksT0FBTyxDQUFDO0lBQzVCLENBQUM7SUFFTSxRQUFRLENBQUMsSUFBVTtRQUN2QixJQUFJLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbEIsS0FBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3pDLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN2QyxJQUFHLENBQUMsS0FBSztnQkFBRSxPQUFPLEtBQUssQ0FBQztTQUMxQjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7Q0FFSjtBQWxCRCw4QkFrQkMifQ==
|
|
@@ -4,12 +4,14 @@ export default abstract class Node {
|
|
|
4
4
|
protected path: string;
|
|
5
5
|
protected label: string;
|
|
6
6
|
protected action: string;
|
|
7
|
+
protected isBinaryFile: boolean;
|
|
7
8
|
constructor(path: string, label: string);
|
|
8
9
|
abstract getNode(path: string): Node;
|
|
9
10
|
abstract getFiles(f?: Filter): Array<string>;
|
|
10
11
|
getName(): string;
|
|
11
12
|
getPath(): string;
|
|
12
13
|
getType(): NodeType;
|
|
14
|
+
isBinary(): boolean;
|
|
13
15
|
}
|
|
14
16
|
export declare enum NodeType {
|
|
15
17
|
FOLDER = "FOLDER",
|
|
@@ -4,6 +4,7 @@ class Node {
|
|
|
4
4
|
constructor(path, label) {
|
|
5
5
|
this.path = path;
|
|
6
6
|
this.label = label;
|
|
7
|
+
this.isBinaryFile = false;
|
|
7
8
|
}
|
|
8
9
|
getName() {
|
|
9
10
|
return this.label;
|
|
@@ -14,6 +15,9 @@ class Node {
|
|
|
14
15
|
getType() {
|
|
15
16
|
return this.type;
|
|
16
17
|
}
|
|
18
|
+
isBinary() {
|
|
19
|
+
return this.isBinaryFile;
|
|
20
|
+
}
|
|
17
21
|
}
|
|
18
22
|
exports.default = Node;
|
|
19
23
|
var NodeType;
|
|
@@ -22,4 +26,4 @@ var NodeType;
|
|
|
22
26
|
NodeType["FILE"] = "FILE";
|
|
23
27
|
})(NodeType = exports.NodeType || (exports.NodeType = {}));
|
|
24
28
|
;
|
|
25
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
29
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTm9kZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zZGsvdHJlZS9Ob2RlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBR0EsTUFBOEIsSUFBSTtJQVdoQyxZQUFZLElBQVksRUFBRSxLQUFhO1FBQ3JDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO0lBQzVCLENBQUM7SUFNTSxPQUFPO1FBQ1osT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7SUFFTSxPQUFPO1FBQ1osT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ25CLENBQUM7SUFFTSxPQUFPO1FBQ1osT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ25CLENBQUM7SUFFTSxRQUFRO1FBQ2IsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzNCLENBQUM7Q0FFRjtBQXJDRCx1QkFxQ0M7QUFFRCxJQUFZLFFBR1g7QUFIRCxXQUFZLFFBQVE7SUFDbEIsNkJBQWlCLENBQUE7SUFDakIseUJBQWEsQ0FBQTtBQUNmLENBQUMsRUFIVyxRQUFRLEdBQVIsZ0JBQVEsS0FBUixnQkFBUSxRQUduQjtBQUFBLENBQUMifQ==
|
|
@@ -8,6 +8,7 @@ const path_1 = __importDefault(require("path"));
|
|
|
8
8
|
const Node_1 = require("./Node");
|
|
9
9
|
const File_1 = __importDefault(require("./File"));
|
|
10
10
|
const Folder_1 = __importDefault(require("./Folder"));
|
|
11
|
+
const isbinaryfile_1 = require("isbinaryfile");
|
|
11
12
|
class Tree {
|
|
12
13
|
constructor(path) {
|
|
13
14
|
const pathParts = path.split(path_1.default.sep);
|
|
@@ -33,8 +34,10 @@ class Tree {
|
|
|
33
34
|
const subTree = this.buildRec(`${path}/${dirEntry.name}`, f);
|
|
34
35
|
root.addChild(subTree);
|
|
35
36
|
}
|
|
36
|
-
else
|
|
37
|
-
|
|
37
|
+
else {
|
|
38
|
+
const file = new File_1.default(fullPath, dirEntry.name, isbinaryfile_1.isBinaryFileSync(fullPath));
|
|
39
|
+
root.addChild(file);
|
|
40
|
+
}
|
|
38
41
|
}
|
|
39
42
|
return root;
|
|
40
43
|
}
|
|
@@ -67,4 +70,4 @@ class Tree {
|
|
|
67
70
|
}
|
|
68
71
|
}
|
|
69
72
|
exports.Tree = Tree;
|
|
70
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
73
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJlZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zZGsvdHJlZS9UcmVlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsNENBQW9CO0FBQ3BCLGdEQUEyQjtBQUczQixpQ0FBa0M7QUFFbEMsa0RBQTBCO0FBQzFCLHNEQUE4QjtBQUc5QiwrQ0FBZ0Q7QUFFaEQsTUFBYSxJQUFJO0lBU2YsWUFBWSxJQUFZO1FBQ3RCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxRQUFRLEdBQUcsY0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2QyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUNyQixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksZ0JBQU0sQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFTSxLQUFLO1FBQ1YsSUFBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUNqQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzlDLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN6QixDQUFDO0lBRU8sUUFBUSxDQUFDLElBQVksRUFBRSxJQUFZO1FBQ3pDLE1BQU0sVUFBVSxHQUFHLFlBQUU7YUFDbEIsV0FBVyxDQUFDLElBQUksRUFBRSxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLHNDQUFzQzthQUNqRixJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDO2FBQzVCLE1BQU0sQ0FBQyxDQUFDLE1BQVcsRUFBRSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztRQUVyRCxLQUFLLE1BQU0sUUFB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
|