shiplint 1.3.0 → 1.5.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.
- package/dist/cli/index.js +6 -3
- package/dist/cli/index.js.map +1 -1
- package/dist/core/scanner.d.ts.map +1 -1
- package/dist/core/scanner.js +5 -1
- package/dist/core/scanner.js.map +1 -1
- package/dist/core/suppression.d.ts +23 -0
- package/dist/core/suppression.d.ts.map +1 -0
- package/dist/core/suppression.js +183 -0
- package/dist/core/suppression.js.map +1 -0
- package/dist/formatters/index.d.ts +2 -1
- package/dist/formatters/index.d.ts.map +1 -1
- package/dist/formatters/index.js +6 -1
- package/dist/formatters/index.js.map +1 -1
- package/dist/formatters/text.d.ts +0 -3
- package/dist/formatters/text.d.ts.map +1 -1
- package/dist/formatters/text.js +214 -58
- package/dist/formatters/text.js.map +1 -1
- package/dist/formatters/xcode.d.ts +7 -0
- package/dist/formatters/xcode.d.ts.map +1 -0
- package/dist/formatters/xcode.js +21 -0
- package/dist/formatters/xcode.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/rules/base.d.ts +2 -0
- package/dist/rules/base.d.ts.map +1 -1
- package/dist/rules/base.js +2 -0
- package/dist/rules/base.js.map +1 -1
- package/dist/rules/code/dynamic-code-execution.d.ts +13 -0
- package/dist/rules/code/dynamic-code-execution.d.ts.map +1 -0
- package/dist/rules/code/dynamic-code-execution.js +212 -0
- package/dist/rules/code/dynamic-code-execution.js.map +1 -0
- package/dist/rules/code/index.d.ts +6 -0
- package/dist/rules/code/index.d.ts.map +1 -0
- package/dist/rules/code/index.js +11 -0
- package/dist/rules/code/index.js.map +1 -0
- package/dist/rules/code/private-api-usage.d.ts +12 -0
- package/dist/rules/code/private-api-usage.d.ts.map +1 -0
- package/dist/rules/code/private-api-usage.js +234 -0
- package/dist/rules/code/private-api-usage.js.map +1 -0
- package/dist/rules/index.d.ts +1 -0
- package/dist/rules/index.d.ts.map +1 -1
- package/dist/rules/index.js +6 -0
- package/dist/rules/index.js.map +1 -1
- package/dist/rules/privacy/att-tracking-mismatch.d.ts.map +1 -1
- package/dist/rules/privacy/att-tracking-mismatch.js +16 -0
- package/dist/rules/privacy/att-tracking-mismatch.js.map +1 -1
- package/dist/types/index.d.ts +8 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/package.json +1 -1
package/dist/cli/index.js
CHANGED
|
@@ -26,16 +26,17 @@ program
|
|
|
26
26
|
.command('scan')
|
|
27
27
|
.description('Scan an Xcode project for potential App Store Review issues')
|
|
28
28
|
.argument('<path>', 'Path to Xcode project, workspace, or directory')
|
|
29
|
-
.option('-f, --format <format>', 'Output format: text, json, sarif', 'text')
|
|
29
|
+
.option('-f, --format <format>', 'Output format: text, json, sarif, xcode', 'text')
|
|
30
30
|
.option('-v, --verbose', 'Show verbose output', false)
|
|
31
31
|
.option('-r, --rules <rules...>', 'Only run specific rules (by ID)')
|
|
32
32
|
.option('-e, --exclude <rules...>', 'Exclude specific rules (by ID)')
|
|
33
|
+
.option('--show-suppressed', 'Show suppressed findings in output', false)
|
|
33
34
|
.action(async (path, options) => {
|
|
34
35
|
try {
|
|
35
36
|
const outputFormat = parseOutputFormat(options.format);
|
|
36
37
|
const result = await (0, scanner_js_1.scan)({
|
|
37
38
|
path,
|
|
38
|
-
format: outputFormat,
|
|
39
|
+
format: outputFormat === 'xcode' ? index_js_3.OutputFormat.Text : outputFormat,
|
|
39
40
|
verbose: options.verbose,
|
|
40
41
|
rules: options.rules,
|
|
41
42
|
exclude: options.exclude,
|
|
@@ -127,8 +128,10 @@ function parseOutputFormat(format) {
|
|
|
127
128
|
return index_js_3.OutputFormat.JSON;
|
|
128
129
|
case 'sarif':
|
|
129
130
|
return index_js_3.OutputFormat.SARIF;
|
|
131
|
+
case 'xcode':
|
|
132
|
+
return 'xcode';
|
|
130
133
|
default:
|
|
131
|
-
throw new Error(`Unknown output format: ${format}. Use text, json, or
|
|
134
|
+
throw new Error(`Unknown output format: ${format}. Use text, json, sarif, or xcode.`);
|
|
132
135
|
}
|
|
133
136
|
}
|
|
134
137
|
program.parse();
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;;;;;AACA;;;;GAIG;AACH,yCAAoC;AACpC,mDAA0C;AAC1C,qDAAgD;AAChD,gDAA6C;AAC7C,gDAAiD;AACjD,gDAAkD;AAClD,iDAA4D;AAC5D,sEAA6C;AAE7C,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../src/core/scanner.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../src/core/scanner.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAM7F;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,KAAK;IACvB,UAAU,EAAE,MAAM,EAAE;IAAS,YAAY,EAAE,MAAM,EAAE;gBAAnD,UAAU,EAAE,MAAM,EAAE,EAAS,YAAY,EAAE,MAAM,EAAE;CAOvE;AAED;;GAEG;AACH,qBAAa,YAAa,SAAQ,KAAK;gBACzB,OAAO,EAAE,MAAM;CAI5B;AAED;;GAEG;AACH,wBAAsB,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CA8FpE;AAkCD;;GAEG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,WAAW,EACpB,KAAK,CAAC,EAAE,IAAI,EAAE,GACb,OAAO,CAAC,OAAO,EAAE,CAAC,CAUpB"}
|
package/dist/core/scanner.js
CHANGED
|
@@ -43,6 +43,7 @@ const fs = __importStar(require("fs"));
|
|
|
43
43
|
const path = __importStar(require("path"));
|
|
44
44
|
const project_parser_js_1 = require("../parsers/project-parser.js");
|
|
45
45
|
const index_js_1 = require("../rules/index.js");
|
|
46
|
+
const suppression_js_1 = require("./suppression.js");
|
|
46
47
|
/**
|
|
47
48
|
* Error thrown when invalid rule IDs are specified
|
|
48
49
|
*/
|
|
@@ -124,6 +125,8 @@ async function scan(options) {
|
|
|
124
125
|
console.warn(`⚠️ ${ruleErrors.length} rule(s) failed to run: ${ruleErrors.join(', ')}. Use --verbose for details.`);
|
|
125
126
|
}
|
|
126
127
|
const duration = Date.now() - startTime;
|
|
128
|
+
// Apply suppression (inline comments + .shiplintignore)
|
|
129
|
+
const { activeFindings, suppressedFindings } = (0, suppression_js_1.applySuppression)(findings, options.path);
|
|
127
130
|
// Determine project type and framework detection method from discovery
|
|
128
131
|
const projectType = deriveProjectType(discovery);
|
|
129
132
|
const frameworkDetectionMethod = deriveFrameworkDetectionMethod(discovery, context);
|
|
@@ -132,7 +135,8 @@ async function scan(options) {
|
|
|
132
135
|
return {
|
|
133
136
|
projectPath: options.path,
|
|
134
137
|
timestamp: new Date(),
|
|
135
|
-
findings,
|
|
138
|
+
findings: activeFindings,
|
|
139
|
+
suppressedFindings,
|
|
136
140
|
rulesRun,
|
|
137
141
|
duration,
|
|
138
142
|
projectType,
|
package/dist/core/scanner.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../src/core/scanner.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../src/core/scanner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { Finding } from '../types/index.js';
|
|
2
|
+
export interface IgnoreEntry {
|
|
3
|
+
ruleId: string;
|
|
4
|
+
filePath?: string;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Parse a .shiplintignore file
|
|
8
|
+
*/
|
|
9
|
+
export declare function parseShiplintIgnore(content: string): IgnoreEntry[];
|
|
10
|
+
/**
|
|
11
|
+
* Load .shiplintignore from project root
|
|
12
|
+
*/
|
|
13
|
+
export declare function loadShiplintIgnore(projectPath: string): IgnoreEntry[];
|
|
14
|
+
export interface SuppressionResult {
|
|
15
|
+
activeFindings: Finding[];
|
|
16
|
+
suppressedFindings: Finding[];
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Apply suppression rules to findings.
|
|
20
|
+
* Returns active and suppressed findings separately.
|
|
21
|
+
*/
|
|
22
|
+
export declare function applySuppression(findings: Finding[], projectPath: string): SuppressionResult;
|
|
23
|
+
//# sourceMappingURL=suppression.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"suppression.d.ts","sourceRoot":"","sources":["../../src/core/suppression.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAIjD,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,EAAE,CAiBlE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,EAAE,CAKrE;AAmFD,MAAM,WAAW,iBAAiB;IAChC,cAAc,EAAE,OAAO,EAAE,CAAC;IAC1B,kBAAkB,EAAE,OAAO,EAAE,CAAC;CAC/B;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,OAAO,EAAE,EACnB,WAAW,EAAE,MAAM,GAClB,iBAAiB,CAgCnB"}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.parseShiplintIgnore = parseShiplintIgnore;
|
|
37
|
+
exports.loadShiplintIgnore = loadShiplintIgnore;
|
|
38
|
+
exports.applySuppression = applySuppression;
|
|
39
|
+
/**
|
|
40
|
+
* Suppression support for ShipLint
|
|
41
|
+
*
|
|
42
|
+
* Two mechanisms:
|
|
43
|
+
* 1. Inline comments: // shiplint-disable-next-line [rule-id]
|
|
44
|
+
* 2. .shiplintignore file: rule-id or rule-id:path/to/file.swift
|
|
45
|
+
*/
|
|
46
|
+
const fs = __importStar(require("fs"));
|
|
47
|
+
const path = __importStar(require("path"));
|
|
48
|
+
const DISABLE_NEXT_LINE_PATTERN = /shiplint-disable-next-line(?:\s+(\S+))?/;
|
|
49
|
+
/**
|
|
50
|
+
* Parse a .shiplintignore file
|
|
51
|
+
*/
|
|
52
|
+
function parseShiplintIgnore(content) {
|
|
53
|
+
const entries = [];
|
|
54
|
+
for (const rawLine of content.split('\n')) {
|
|
55
|
+
const line = rawLine.trim();
|
|
56
|
+
if (!line || line.startsWith('#'))
|
|
57
|
+
continue;
|
|
58
|
+
const colonIndex = line.indexOf(':');
|
|
59
|
+
if (colonIndex > 0) {
|
|
60
|
+
entries.push({
|
|
61
|
+
ruleId: line.substring(0, colonIndex),
|
|
62
|
+
filePath: line.substring(colonIndex + 1),
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
entries.push({ ruleId: line });
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return entries;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Load .shiplintignore from project root
|
|
73
|
+
*/
|
|
74
|
+
function loadShiplintIgnore(projectPath) {
|
|
75
|
+
const ignorePath = path.join(projectPath, '.shiplintignore');
|
|
76
|
+
if (!fs.existsSync(ignorePath))
|
|
77
|
+
return [];
|
|
78
|
+
const content = fs.readFileSync(ignorePath, 'utf-8');
|
|
79
|
+
return parseShiplintIgnore(content);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Check if a finding is suppressed by .shiplintignore
|
|
83
|
+
*/
|
|
84
|
+
function isSuppressedByIgnoreFile(finding, ignoreEntries, projectPath) {
|
|
85
|
+
for (const entry of ignoreEntries) {
|
|
86
|
+
if (entry.ruleId !== finding.ruleId)
|
|
87
|
+
continue;
|
|
88
|
+
if (!entry.filePath) {
|
|
89
|
+
// Rule suppressed everywhere
|
|
90
|
+
return `.shiplintignore: ${entry.ruleId}`;
|
|
91
|
+
}
|
|
92
|
+
// Rule suppressed in specific file - check if finding's location matches
|
|
93
|
+
if (finding.location) {
|
|
94
|
+
const findingRelPath = path.isAbsolute(finding.location)
|
|
95
|
+
? path.relative(projectPath, finding.location)
|
|
96
|
+
: finding.location;
|
|
97
|
+
if (findingRelPath === entry.filePath || finding.location === entry.filePath) {
|
|
98
|
+
return `.shiplintignore: ${entry.ruleId}:${entry.filePath}`;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
// Cache for file contents used in inline suppression checks
|
|
105
|
+
const fileContentCache = new Map();
|
|
106
|
+
function getFileLines(filePath) {
|
|
107
|
+
if (fileContentCache.has(filePath))
|
|
108
|
+
return fileContentCache.get(filePath);
|
|
109
|
+
try {
|
|
110
|
+
if (!fs.existsSync(filePath))
|
|
111
|
+
return null;
|
|
112
|
+
const lines = fs.readFileSync(filePath, 'utf-8').split('\n');
|
|
113
|
+
fileContentCache.set(filePath, lines);
|
|
114
|
+
return lines;
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Check if a finding is suppressed by an inline comment
|
|
122
|
+
*/
|
|
123
|
+
function isSuppressedByInlineComment(finding, projectPath) {
|
|
124
|
+
if (!finding.location || !finding.line || finding.line <= 1)
|
|
125
|
+
return null;
|
|
126
|
+
const filePath = path.isAbsolute(finding.location)
|
|
127
|
+
? finding.location
|
|
128
|
+
: path.join(projectPath, finding.location);
|
|
129
|
+
const lines = getFileLines(filePath);
|
|
130
|
+
if (!lines)
|
|
131
|
+
return null;
|
|
132
|
+
// Check line N-1 (0-indexed: finding.line - 2)
|
|
133
|
+
const prevLineIndex = finding.line - 2;
|
|
134
|
+
if (prevLineIndex < 0 || prevLineIndex >= lines.length)
|
|
135
|
+
return null;
|
|
136
|
+
const prevLine = lines[prevLineIndex];
|
|
137
|
+
const match = prevLine.match(DISABLE_NEXT_LINE_PATTERN);
|
|
138
|
+
if (!match)
|
|
139
|
+
return null;
|
|
140
|
+
const specifiedRuleId = match[1];
|
|
141
|
+
if (!specifiedRuleId) {
|
|
142
|
+
// No rule ID = suppress all rules on next line
|
|
143
|
+
return 'inline: shiplint-disable-next-line';
|
|
144
|
+
}
|
|
145
|
+
if (specifiedRuleId === finding.ruleId) {
|
|
146
|
+
return `inline: shiplint-disable-next-line ${specifiedRuleId}`;
|
|
147
|
+
}
|
|
148
|
+
// Rule ID doesn't match
|
|
149
|
+
return null;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Apply suppression rules to findings.
|
|
153
|
+
* Returns active and suppressed findings separately.
|
|
154
|
+
*/
|
|
155
|
+
function applySuppression(findings, projectPath) {
|
|
156
|
+
// Clear file content cache
|
|
157
|
+
fileContentCache.clear();
|
|
158
|
+
const ignoreEntries = loadShiplintIgnore(projectPath);
|
|
159
|
+
const activeFindings = [];
|
|
160
|
+
const suppressedFindings = [];
|
|
161
|
+
for (const finding of findings) {
|
|
162
|
+
// Check .shiplintignore first
|
|
163
|
+
let reason = isSuppressedByIgnoreFile(finding, ignoreEntries, projectPath);
|
|
164
|
+
// Check inline comment
|
|
165
|
+
if (!reason) {
|
|
166
|
+
reason = isSuppressedByInlineComment(finding, projectPath);
|
|
167
|
+
}
|
|
168
|
+
if (reason) {
|
|
169
|
+
suppressedFindings.push({
|
|
170
|
+
...finding,
|
|
171
|
+
suppressed: true,
|
|
172
|
+
suppressionReason: reason,
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
activeFindings.push(finding);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
// Clear cache after use
|
|
180
|
+
fileContentCache.clear();
|
|
181
|
+
return { activeFindings, suppressedFindings };
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=suppression.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"suppression.js","sourceRoot":"","sources":["../../src/core/suppression.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,8 +6,9 @@ import { OutputFormat } from '../types/index.js';
|
|
|
6
6
|
export { formatText } from './text.js';
|
|
7
7
|
export { formatJSON, formatJSONCompact } from './json.js';
|
|
8
8
|
export { formatSARIF } from './sarif.js';
|
|
9
|
+
export { formatXcode } from './xcode.js';
|
|
9
10
|
/**
|
|
10
11
|
* Format scan results based on output format
|
|
11
12
|
*/
|
|
12
|
-
export declare function format(result: ScanResult, outputFormat: OutputFormat): Promise<string>;
|
|
13
|
+
export declare function format(result: ScanResult, outputFormat: OutputFormat | 'xcode'): Promise<string>;
|
|
13
14
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/formatters/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/formatters/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAMjD,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC;;GAEG;AACH,wBAAsB,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,GAAG,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAWtG"}
|
package/dist/formatters/index.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.formatSARIF = exports.formatJSONCompact = exports.formatJSON = exports.formatText = void 0;
|
|
3
|
+
exports.formatXcode = exports.formatSARIF = exports.formatJSONCompact = exports.formatJSON = exports.formatText = void 0;
|
|
4
4
|
exports.format = format;
|
|
5
5
|
const index_js_1 = require("../types/index.js");
|
|
6
6
|
const text_js_1 = require("./text.js");
|
|
7
7
|
const json_js_1 = require("./json.js");
|
|
8
8
|
const sarif_js_1 = require("./sarif.js");
|
|
9
|
+
const xcode_js_1 = require("./xcode.js");
|
|
9
10
|
var text_js_2 = require("./text.js");
|
|
10
11
|
Object.defineProperty(exports, "formatText", { enumerable: true, get: function () { return text_js_2.formatText; } });
|
|
11
12
|
var json_js_2 = require("./json.js");
|
|
@@ -13,6 +14,8 @@ Object.defineProperty(exports, "formatJSON", { enumerable: true, get: function (
|
|
|
13
14
|
Object.defineProperty(exports, "formatJSONCompact", { enumerable: true, get: function () { return json_js_2.formatJSONCompact; } });
|
|
14
15
|
var sarif_js_2 = require("./sarif.js");
|
|
15
16
|
Object.defineProperty(exports, "formatSARIF", { enumerable: true, get: function () { return sarif_js_2.formatSARIF; } });
|
|
17
|
+
var xcode_js_2 = require("./xcode.js");
|
|
18
|
+
Object.defineProperty(exports, "formatXcode", { enumerable: true, get: function () { return xcode_js_2.formatXcode; } });
|
|
16
19
|
/**
|
|
17
20
|
* Format scan results based on output format
|
|
18
21
|
*/
|
|
@@ -24,6 +27,8 @@ async function format(result, outputFormat) {
|
|
|
24
27
|
return (0, json_js_1.formatJSON)(result);
|
|
25
28
|
case index_js_1.OutputFormat.SARIF:
|
|
26
29
|
return (0, sarif_js_1.formatSARIF)(result);
|
|
30
|
+
case 'xcode':
|
|
31
|
+
return (0, xcode_js_1.formatXcode)(result);
|
|
27
32
|
}
|
|
28
33
|
}
|
|
29
34
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/formatters/index.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/formatters/index.ts"],"names":[],"mappings":";;;AAkBA,wBAWC;AAzBD,gDAAiD;AACjD,uCAAuC;AACvC,uCAAuC;AACvC,yCAAyC;AACzC,yCAAyC;AAEzC,qCAAuC;AAA9B,qGAAA,UAAU,OAAA;AACnB,qCAA0D;AAAjD,qGAAA,UAAU,OAAA;AAAE,4GAAA,iBAAiB,OAAA;AACtC,uCAAyC;AAAhC,uGAAA,WAAW,OAAA;AACpB,uCAAyC;AAAhC,uGAAA,WAAW,OAAA;AAEpB;;GAEG;AACI,KAAK,UAAU,MAAM,CAAC,MAAkB,EAAE,YAAoC;IACnF,QAAQ,YAAY,EAAE,CAAC;QACrB,KAAK,uBAAY,CAAC,IAAI;YACpB,OAAO,IAAA,oBAAU,EAAC,MAAM,CAAC,CAAC;QAC5B,KAAK,uBAAY,CAAC,IAAI;YACpB,OAAO,IAAA,oBAAU,EAAC,MAAM,CAAC,CAAC;QAC5B,KAAK,uBAAY,CAAC,KAAK;YACrB,OAAO,IAAA,sBAAW,EAAC,MAAM,CAAC,CAAC;QAC7B,KAAK,OAAO;YACV,OAAO,IAAA,sBAAW,EAAC,MAAM,CAAC,CAAC;IAC/B,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../src/formatters/text.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../src/formatters/text.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAW,MAAM,mBAAmB,CAAC;AA+L7D;;GAEG;AACH,wBAAsB,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAqFpE"}
|