scanoss 0.36.0 → 0.37.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 (42) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/build/main/cli/commands/scan.js +34 -35
  3. package/build/main/sdk/scanner/Dispatcher/Dispatcher.js +3 -2
  4. package/build/main/sdk/scanner/ScanSettingsBuilder.d.ts +6 -1
  5. package/build/main/sdk/scanner/ScanSettingsBuilder.js +51 -3
  6. package/build/main/sdk/scanner/ScanSettingsBuilder.spec.js +55 -1
  7. package/build/main/sdk/scanner/Scannable/ScannableItem.d.ts +3 -0
  8. package/build/main/sdk/scanner/Scannable/ScannableItem.js +8 -1
  9. package/build/main/sdk/scanner/Scanner.d.ts +1 -0
  10. package/build/main/sdk/scanner/Scanner.js +31 -18
  11. package/build/main/sdk/scanner/ScannerCfg.d.ts +2 -0
  12. package/build/main/sdk/scanner/ScannerCfg.js +1 -1
  13. package/build/main/sdk/scanner/ScannerTypes.d.ts +3 -0
  14. package/build/main/sdk/scanner/ScannerTypes.js +1 -1
  15. package/build/main/sdk/scanner/ScannnerResultPostProcessor/interfaces/types.d.ts +11 -0
  16. package/build/main/sdk/scanner/ScannnerResultPostProcessor/rules/remove-rule.js +3 -2
  17. package/build/main/sdk/scanner/WfpProvider/WfpCalculator/HeaderFilter.d.ts +17 -0
  18. package/build/main/sdk/scanner/WfpProvider/WfpCalculator/HeaderFilter.js +313 -0
  19. package/build/main/sdk/scanner/WfpProvider/WfpCalculator/WfpCalculator.d.ts +1 -0
  20. package/build/main/sdk/scanner/WfpProvider/WfpCalculator/WfpCalculator.js +18 -2
  21. package/build/main/tsconfig.tsbuildinfo +1 -1
  22. package/build/module/cli/commands/scan.js +32 -33
  23. package/build/module/sdk/scanner/Dispatcher/Dispatcher.js +3 -2
  24. package/build/module/sdk/scanner/ScanSettingsBuilder.d.ts +6 -1
  25. package/build/module/sdk/scanner/ScanSettingsBuilder.js +46 -3
  26. package/build/module/sdk/scanner/ScanSettingsBuilder.spec.js +55 -1
  27. package/build/module/sdk/scanner/Scannable/ScannableItem.d.ts +3 -0
  28. package/build/module/sdk/scanner/Scannable/ScannableItem.js +9 -1
  29. package/build/module/sdk/scanner/Scanner.d.ts +1 -0
  30. package/build/module/sdk/scanner/Scanner.js +27 -15
  31. package/build/module/sdk/scanner/ScannerCfg.d.ts +2 -0
  32. package/build/module/sdk/scanner/ScannerCfg.js +2 -1
  33. package/build/module/sdk/scanner/ScannerTypes.d.ts +3 -0
  34. package/build/module/sdk/scanner/ScannerTypes.js +1 -1
  35. package/build/module/sdk/scanner/ScannnerResultPostProcessor/interfaces/types.d.ts +11 -0
  36. package/build/module/sdk/scanner/ScannnerResultPostProcessor/rules/remove-rule.js +2 -2
  37. package/build/module/sdk/scanner/WfpProvider/WfpCalculator/HeaderFilter.d.ts +17 -0
  38. package/build/module/sdk/scanner/WfpProvider/WfpCalculator/HeaderFilter.js +306 -0
  39. package/build/module/sdk/scanner/WfpProvider/WfpCalculator/WfpCalculator.d.ts +1 -0
  40. package/build/module/sdk/scanner/WfpProvider/WfpCalculator/WfpCalculator.js +18 -2
  41. package/build/module/tsconfig.module.tsbuildinfo +1 -1
  42. package/package.json +1 -1
@@ -0,0 +1,313 @@
1
+ "use strict";
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) 2025, SCANOSS
4
+ var __importDefault = (this && this.__importDefault) || function (mod) {
5
+ return (mod && mod.__esModule) ? mod : { "default": mod };
6
+ };
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.HeaderFilter = void 0;
9
+ exports.stripLinesUntilOffset = stripLinesUntilOffset;
10
+ const path_1 = __importDefault(require("path"));
11
+ const COMPLETE_DOCSTRING_QUOTE_COUNT = 2;
12
+ const LICENSE_HEADER_MAX_LINES = 50;
13
+ const COMMENT_PATTERNS = {
14
+ c_style: {
15
+ single_line: String.raw `^\s*//.*$`,
16
+ multi_start: String.raw `^\s*/\*`,
17
+ multi_end: String.raw `\*/\s*$`,
18
+ multi_single: String.raw `^\s*/\*.*\*/\s*$`,
19
+ },
20
+ python_style: {
21
+ single_line: String.raw `^\s*#.*$`,
22
+ doc_string_start: String.raw `^\s*"""`,
23
+ doc_string_end: String.raw `"""\s*$`,
24
+ },
25
+ lua_style: {
26
+ single_line: String.raw `^\s*--.*$`,
27
+ multi_start: String.raw `^\s*--\[\[`,
28
+ multi_end: String.raw `\]\]\s*$`,
29
+ },
30
+ html_style: {
31
+ multi_start: String.raw `^\s*<!--`,
32
+ multi_end: String.raw `-->\s*$`,
33
+ multi_single: String.raw `^\s*<!--.*-->\s*$`,
34
+ },
35
+ };
36
+ const IMPORT_PATTERNS = {
37
+ python: [String.raw `^\s*import\s+`, String.raw `^\s*from\s+.*\s+import\s+`],
38
+ javascript: [
39
+ String.raw `^\s*import\s+.*\s+from\s+`,
40
+ String.raw `^\s*import\s+['"]`,
41
+ String.raw `^\s*import\s+type\s+`,
42
+ String.raw `^\s*export\s+\*\s+from\s+`,
43
+ String.raw `^\s*export\s+\{.*\}\s+from\s+`,
44
+ String.raw `^\s*const\s+.*\s*=\s*require\(`,
45
+ String.raw `^\s*var\s+.*\s*=\s*require\(`,
46
+ String.raw `^\s*let\s+.*\s*=\s*require\(`,
47
+ ],
48
+ typescript: [
49
+ String.raw `^\s*import\s+`,
50
+ String.raw `^\s*export\s+.*\s+from\s+`,
51
+ String.raw `^\s*import\s+type\s+`,
52
+ String.raw `^\s*import\s+\{.*\}\s+from\s+`,
53
+ ],
54
+ java: [String.raw `^\s*import\s+`, String.raw `^\s*package\s+`],
55
+ kotlin: [String.raw `^\s*import\s+`, String.raw `^\s*package\s+`],
56
+ scala: [String.raw `^\s*import\s+`, String.raw `^\s*package\s+`],
57
+ go: [
58
+ String.raw `^\s*import\s+\(`,
59
+ String.raw `^\s*import\s+"`,
60
+ String.raw `^\s*package\s+`,
61
+ String.raw `^\s*"[^"]*"\s*$`,
62
+ String.raw `^\s*[a-zA-Z_][a-zA-Z0-9_]*\s+"[^"]*"\s*$`,
63
+ String.raw `^\s*_\s+"[^"]*"\s*$`,
64
+ ],
65
+ rust: [String.raw `^\s*use\s+`, String.raw `^\s*extern\s+crate\s+`, String.raw `^\s*mod\s+`],
66
+ cpp: [
67
+ String.raw `^\s*#include\s+`,
68
+ String.raw `^\s*#pragma\s+`,
69
+ String.raw `^\s*#ifndef\s+.*_H.*`,
70
+ String.raw `^\s*#define\s+.*_H.*`,
71
+ String.raw `^\s*#endif\s+(//.*)?\s*$`,
72
+ ],
73
+ csharp: [String.raw `^\s*using\s+`, String.raw `^\s*namespace\s+`],
74
+ php: [
75
+ String.raw `^\s*use\s+`,
76
+ String.raw `^\s*require\s+`,
77
+ String.raw `^\s*require_once\s+`,
78
+ String.raw `^\s*include\s+`,
79
+ String.raw `^\s*include_once\s+`,
80
+ String.raw `^\s*namespace\s+`,
81
+ ],
82
+ swift: [String.raw `^\s*import\s+`],
83
+ ruby: [String.raw `^\s*require\s+`, String.raw `^\s*require_relative\s+`, String.raw `^\s*load\s+`],
84
+ perl: [String.raw `^\s*use\s+`, String.raw `^\s*require\s+`],
85
+ r: [String.raw `^\s*library\(`, String.raw `^\s*require\(`, String.raw `^\s*source\(`],
86
+ lua: [String.raw `^\s*require\s+`, String.raw `^\s*local\s+.*\s*=\s*require\(`],
87
+ dart: [String.raw `^\s*import\s+`, String.raw `^\s*export\s+`, String.raw `^\s*part\s+`],
88
+ haskell: [String.raw `^\s*import\s+`, String.raw `^\s*module\s+`],
89
+ elixir: [
90
+ String.raw `^\s*import\s+`,
91
+ String.raw `^\s*alias\s+`,
92
+ String.raw `^\s*require\s+`,
93
+ String.raw `^\s*use\s+`,
94
+ ],
95
+ clojure: [
96
+ String.raw `^\s*\(\s*ns\s+`,
97
+ String.raw `^\s*\(\s*require\s+`,
98
+ String.raw `^\s*\(\s*import\s+`,
99
+ ],
100
+ };
101
+ const LICENSE_KEYWORDS = [
102
+ 'copyright', 'license', 'licensed', 'all rights reserved',
103
+ 'permission', 'redistribution', 'warranty', 'liability',
104
+ 'apache', 'mit', 'gpl', 'bsd', 'mozilla', 'author:',
105
+ 'spdx-license', 'contributors', 'licensee',
106
+ ];
107
+ const EXT_MAP = {
108
+ '.py': 'python', '.js': 'javascript', '.mjs': 'javascript',
109
+ '.cjs': 'javascript', '.ts': 'typescript', '.tsx': 'typescript',
110
+ '.jsx': 'javascript', '.java': 'java', '.kt': 'kotlin',
111
+ '.kts': 'kotlin', '.scala': 'scala', '.sc': 'scala',
112
+ '.go': 'go', '.rs': 'rust', '.cpp': 'cpp', '.cc': 'cpp',
113
+ '.cxx': 'cpp', '.c': 'cpp', '.h': 'cpp', '.hpp': 'cpp',
114
+ '.hxx': 'cpp', '.cs': 'csharp', '.php': 'php', '.swift': 'swift',
115
+ '.rb': 'ruby', '.pl': 'perl', '.pm': 'perl', '.r': 'r', '.R': 'r',
116
+ '.lua': 'lua', '.dart': 'dart', '.hs': 'haskell', '.ex': 'elixir',
117
+ '.exs': 'elixir', '.clj': 'clojure', '.cljs': 'clojure',
118
+ '.m': 'cpp', '.mm': 'cpp', '.sh': 'python', '.bash': 'python',
119
+ '.zsh': 'python', '.fish': 'python',
120
+ };
121
+ function isBlankLine(stripped) {
122
+ return stripped.length === 0;
123
+ }
124
+ function isShebang(stripped) {
125
+ return stripped.startsWith('#!');
126
+ }
127
+ class HeaderFilter {
128
+ constructor(skipLimit) {
129
+ this.maxLines = skipLimit != null && skipLimit > 0 ? skipLimit : null;
130
+ }
131
+ filter(file, decodedContents) {
132
+ if (!decodedContents || !file) {
133
+ return 0;
134
+ }
135
+ const language = this.detectLanguage(file);
136
+ if (!language) {
137
+ return 0;
138
+ }
139
+ const lines = decodedContents.split(/\r?\n/);
140
+ if (lines.length === 0) {
141
+ return 0;
142
+ }
143
+ const implementationStart = this.findFirstImplementationLine(lines, language);
144
+ if (implementationStart === null) {
145
+ return 0;
146
+ }
147
+ let lineOffset = implementationStart - 1;
148
+ if (this.maxLines !== null && this.maxLines > 0 && this.maxLines < lineOffset) {
149
+ lineOffset = this.maxLines;
150
+ }
151
+ return lineOffset;
152
+ }
153
+ detectLanguage(filePath) {
154
+ const ext = path_1.default.extname(filePath).toLowerCase();
155
+ if (!ext)
156
+ return null;
157
+ return EXT_MAP[ext] || null;
158
+ }
159
+ getCommentStyle(language) {
160
+ const cStyleLanguages = [
161
+ 'cpp', 'java', 'kotlin', 'scala', 'javascript', 'typescript',
162
+ 'go', 'rust', 'csharp', 'php', 'swift', 'dart',
163
+ ];
164
+ const pythonStyleLanguages = ['python', 'ruby', 'perl', 'r'];
165
+ const luaStyleLanguages = ['lua', 'haskell'];
166
+ if (cStyleLanguages.includes(language))
167
+ return 'c_style';
168
+ if (pythonStyleLanguages.includes(language))
169
+ return 'python_style';
170
+ if (luaStyleLanguages.includes(language))
171
+ return 'lua_style';
172
+ return 'c_style';
173
+ }
174
+ isLicenseHeader(line) {
175
+ const lineLower = line.toLowerCase();
176
+ return LICENSE_KEYWORDS.some(keyword => lineLower.includes(keyword));
177
+ }
178
+ isComment(line, inMultiline, patterns) {
179
+ if (!patterns)
180
+ return [false, inMultiline];
181
+ if (inMultiline) {
182
+ if (patterns.multi_end && new RegExp(patterns.multi_end).test(line)) {
183
+ return [true, false];
184
+ }
185
+ if (patterns.doc_string_end && new RegExp(patterns.doc_string_end).test(line)) {
186
+ return [true, false];
187
+ }
188
+ return [true, true];
189
+ }
190
+ if (patterns.single_line && new RegExp(patterns.single_line).test(line)) {
191
+ return [true, false];
192
+ }
193
+ if (patterns.multi_single && new RegExp(patterns.multi_single).test(line)) {
194
+ return [true, false];
195
+ }
196
+ if (patterns.multi_start && new RegExp(patterns.multi_start).test(line)) {
197
+ if (patterns.multi_end && new RegExp(patterns.multi_end).test(line)) {
198
+ return [true, false];
199
+ }
200
+ return [true, true];
201
+ }
202
+ if (patterns.doc_string_start && line.includes('"""')) {
203
+ const count = (line.match(/"""/g) || []).length;
204
+ if (count === COMPLETE_DOCSTRING_QUOTE_COUNT) {
205
+ return [true, false];
206
+ }
207
+ if (count === 1) {
208
+ return [true, true];
209
+ }
210
+ }
211
+ return [false, inMultiline];
212
+ }
213
+ isImport(line, patterns) {
214
+ if (!patterns)
215
+ return false;
216
+ return patterns.some(pattern => new RegExp(pattern).test(line));
217
+ }
218
+ findFirstImplementationLine(lines, language) {
219
+ if (!lines.length || !language)
220
+ return null;
221
+ let inMultilineComment = false;
222
+ let inLicenseSection = false;
223
+ let inImportBlock = false;
224
+ let consecutiveImportsCount = 0;
225
+ const commentStyle = this.getCommentStyle(language);
226
+ const commentPatterns = COMMENT_PATTERNS[commentStyle];
227
+ const importPatterns = IMPORT_PATTERNS[language];
228
+ for (let i = 0; i < lines.length; i++) {
229
+ const lineNumber = i + 1;
230
+ const stripped = lines[i].trim();
231
+ if ((i === 0 && isShebang(stripped)) || isBlankLine(stripped)) {
232
+ continue;
233
+ }
234
+ const [isAComment, stillInMultiline] = this.isComment(lines[i], inMultilineComment, commentPatterns);
235
+ inMultilineComment = stillInMultiline;
236
+ if (isAComment) {
237
+ if (this.isLicenseHeader(lines[i])) {
238
+ inLicenseSection = true;
239
+ }
240
+ else if (inLicenseSection && lineNumber < LICENSE_HEADER_MAX_LINES) {
241
+ // Continue within license section
242
+ }
243
+ else {
244
+ inLicenseSection = false;
245
+ }
246
+ continue;
247
+ }
248
+ if (!isAComment) {
249
+ inLicenseSection = false;
250
+ }
251
+ // Go import block handling
252
+ if (language === 'go') {
253
+ if (stripped.startsWith('import (')) {
254
+ inImportBlock = true;
255
+ continue;
256
+ }
257
+ if (inImportBlock) {
258
+ if (stripped === ')') {
259
+ inImportBlock = false;
260
+ continue;
261
+ }
262
+ if (stripped.startsWith('"') ||
263
+ stripped.startsWith('_') ||
264
+ /^[a-zA-Z_][a-zA-Z0-9_]*\s+"/.test(stripped)) {
265
+ continue;
266
+ }
267
+ }
268
+ }
269
+ if (this.isImport(lines[i], importPatterns)) {
270
+ if (consecutiveImportsCount === 0) {
271
+ // First import detected
272
+ }
273
+ consecutiveImportsCount += 1;
274
+ continue;
275
+ }
276
+ return lineNumber;
277
+ }
278
+ return null;
279
+ }
280
+ }
281
+ exports.HeaderFilter = HeaderFilter;
282
+ /**
283
+ * Strip WFP snippet lines up to and including the line_offset.
284
+ * Inserts a `start_line=<offset>` tag before the first kept snippet line.
285
+ * Preserves non-snippet lines (file=, fh2=, hpsm=, etc.).
286
+ */
287
+ function stripLinesUntilOffset(wfp, lineOffset) {
288
+ if (lineOffset <= 0)
289
+ return wfp;
290
+ const lines = wfp.split('\n');
291
+ const filteredLines = [];
292
+ let startLineAdded = false;
293
+ for (const line of lines) {
294
+ const eqIndex = line.indexOf('=');
295
+ if (eqIndex > 0) {
296
+ const prefix = line.substring(0, eqIndex);
297
+ if (/^\d+$/.test(prefix)) {
298
+ const lineNum = parseInt(prefix, 10);
299
+ if (lineNum > lineOffset) {
300
+ if (!startLineAdded) {
301
+ filteredLines.push(`start_line=${lineOffset}`);
302
+ startLineAdded = true;
303
+ }
304
+ filteredLines.push(line);
305
+ }
306
+ continue;
307
+ }
308
+ }
309
+ filteredLines.push(line);
310
+ }
311
+ return filteredLines.join('\n');
312
+ }
313
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSGVhZGVyRmlsdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL3Nkay9zY2FubmVyL1dmcFByb3ZpZGVyL1dmcENhbGN1bGF0b3IvSGVhZGVyRmlsdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSwrQkFBK0I7QUFDL0IsOEJBQThCOzs7Ozs7QUFrVTlCLHNEQTJCQztBQTNWRCxnREFBd0I7QUFFeEIsTUFBTSw4QkFBOEIsR0FBRyxDQUFDLENBQUM7QUFDekMsTUFBTSx3QkFBd0IsR0FBRyxFQUFFLENBQUM7QUFXcEMsTUFBTSxnQkFBZ0IsR0FBb0M7SUFDeEQsT0FBTyxFQUFFO1FBQ1AsV0FBVyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUEsV0FBVztRQUNsQyxXQUFXLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQSxTQUFTO1FBQ2hDLFNBQVMsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFBLFNBQVM7UUFDOUIsWUFBWSxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUEsa0JBQWtCO0tBQzNDO0lBQ0QsWUFBWSxFQUFFO1FBQ1osV0FBVyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUEsVUFBVTtRQUNqQyxnQkFBZ0IsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFBLFNBQVM7UUFDckMsY0FBYyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUEsU0FBUztLQUNwQztJQUNELFNBQVMsRUFBRTtRQUNULFdBQVcsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFBLFdBQVc7UUFDbEMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUEsWUFBWTtRQUNuQyxTQUFTLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQSxVQUFVO0tBQ2hDO0lBQ0QsVUFBVSxFQUFFO1FBQ1YsV0FBVyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUEsVUFBVTtRQUNqQyxTQUFTLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQSxTQUFTO1FBQzlCLFlBQVksRUFB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
@@ -5,6 +5,7 @@ export declare class WfpCalculator extends WfpProvider {
5
5
  private fileList;
6
6
  private fileListIndex;
7
7
  private continue;
8
+ private headerFilter;
8
9
  constructor(scannerCfg?: ScannerCfg);
9
10
  init(): void;
10
11
  prepareWorker(): void;
@@ -11,6 +11,7 @@ const ScannerCfg_1 = require("../../ScannerCfg");
11
11
  const ScannerTypes_1 = require("../../ScannerTypes");
12
12
  const FingerprintPackage_1 = require("../FingerprintPackage");
13
13
  const WfpProvider_1 = require("../WfpProvider");
14
+ const HeaderFilter_1 = require("./HeaderFilter");
14
15
  const stringWorker = `
15
16
  const { parentPort } = require('worker_threads');
16
17
 
@@ -506,6 +507,7 @@ class WfpCalculator extends WfpProvider_1.WfpProvider {
506
507
  constructor(scannerCfg = new ScannerCfg_1.ScannerCfg()) {
507
508
  super();
508
509
  this.scannerCfg = scannerCfg;
510
+ this.headerFilter = null;
509
511
  }
510
512
  init() {
511
513
  super.init();
@@ -516,7 +518,11 @@ class WfpCalculator extends WfpProvider_1.WfpProvider {
516
518
  prepareWorker() {
517
519
  this.worker = new worker_threads_1.Worker(stringWorker, { eval: true });
518
520
  this.worker.on('message', async (scannableItem) => {
519
- this.fingerprintPacker(scannableItem.fingerprint);
521
+ let fingerprint = scannableItem.fingerprint;
522
+ if (scannableItem.lineOffset > 0) {
523
+ fingerprint = (0, HeaderFilter_1.stripLinesUntilOffset)(fingerprint, scannableItem.lineOffset);
524
+ }
525
+ this.fingerprintPacker(fingerprint);
520
526
  await this.nextStepMachine();
521
527
  });
522
528
  }
@@ -557,6 +563,10 @@ class WfpCalculator extends WfpProvider_1.WfpProvider {
557
563
  if (!(this.fileListIndex % this.scannerCfg.WINNOWING_REPORT_STATUS_AFTER_X))
558
564
  this.emit(ScannerTypes_1.ScannerEvents.WINNOWING_STATUS, this.scannerCfg.WINNOWING_REPORT_STATUS_AFTER_X);
559
565
  const scannable = new ScannableItem_1.ScannableItem(content, contentSource, this.winnowingMode, this.scannerCfg.WFP_FILE_MAX_SIZE);
566
+ if (this.headerFilter && content.length > 0) {
567
+ const lineOffset = this.headerFilter.filter(path, content.toString('utf-8'));
568
+ scannable.setLineOffset(lineOffset);
569
+ }
560
570
  return scannable;
561
571
  }
562
572
  async readFile(path) {
@@ -586,11 +596,17 @@ class WfpCalculator extends WfpProvider_1.WfpProvider {
586
596
  }
587
597
  }
588
598
  start(params) {
599
+ var _a, _b, _c;
589
600
  if (!params.fileList)
590
601
  this.sendError('File list is required');
591
602
  this.sendLog('[ SCANNER ]: WFP Calculator starting...');
592
603
  this.init();
593
604
  this.prepareWorker();
605
+ const fileSnippet = (_c = (_b = (_a = this.scannerCfg) === null || _a === void 0 ? void 0 : _a.SCANOSS_SETTINGS) === null || _b === void 0 ? void 0 : _b.settings) === null || _c === void 0 ? void 0 : _c.file_snippet;
606
+ if (fileSnippet === null || fileSnippet === void 0 ? void 0 : fileSnippet.skip_headers) {
607
+ this.headerFilter = new HeaderFilter_1.HeaderFilter(fileSnippet.skip_headers_limit);
608
+ this.sendLog('[ SCANNER ]: Header filter enabled');
609
+ }
594
610
  if (params.winnowingMode)
595
611
  this.setWinnowingMode(params.winnowingMode);
596
612
  if (params.obfuscate)
@@ -624,4 +640,4 @@ class WfpCalculator extends WfpProvider_1.WfpProvider {
624
640
  }
625
641
  }
626
642
  exports.WfpCalculator = WfpCalculator;
627
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV2ZwQ2FsY3VsYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9zZGsvc2Nhbm5lci9XZnBQcm92aWRlci9XZnBDYWxjdWxhdG9yL1dmcENhbGN1bGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsNENBQW9CO0FBQ3BCLG1EQUF3QztBQUV4QyxpRUFBOEQ7QUFDOUQsaURBQThDO0FBQzlDLHFEQUFnRjtBQUVoRiw4REFBMkQ7QUFDM0QsZ0RBQWdFO0FBRWhFLE1BQU0sWUFBWSxHQUFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBMGVwQixDQUFDO0FBRUYsTUFBYSxhQUFjLFNBQVEseUJBQVc7SUFPNUMsWUFBWSxVQUFVLEdBQUcsSUFBSSx1QkFBVSxFQUFFO1FBQ3ZDLEtBQUssRUFBRSxDQUFDO1FBQ1IsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFV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
643
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV2ZwQ2FsY3VsYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9zZGsvc2Nhbm5lci9XZnBQcm92aWRlci9XZnBDYWxjdWxhdG9yL1dmcENhbGN1bGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsNENBQW9CO0FBQ3BCLG1EQUF3QztBQUV4QyxpRUFBOEQ7QUFDOUQsaURBQThDO0FBQzlDLHFEQUFnRjtBQUVoRiw4REFBMkQ7QUFDM0QsZ0RBQWdFO0FBQ2hFLGlEQUFxRTtBQUVyRSxNQUFNLFlBQVksR0FBRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQTBlcEIsQ0FBQztBQUVGLE1BQWEsYUFBYyxTQUFRLHlCQUFXO0lBUzVDLFlBQVksVUFBVSxHQUFHLElBQUksdUJBQVUsRUFBRTtRQUN2QyxLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxV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