shiplint 0.1.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/README.md +107 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +101 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/core/index.d.ts +5 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +21 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/scanner.d.ts +27 -0
- package/dist/core/scanner.d.ts.map +1 -0
- package/dist/core/scanner.js +104 -0
- package/dist/core/scanner.js.map +1 -0
- package/dist/formatters/index.d.ts +13 -0
- package/dist/formatters/index.d.ts.map +1 -0
- package/dist/formatters/index.js +29 -0
- package/dist/formatters/index.js.map +1 -0
- package/dist/formatters/json.d.ts +13 -0
- package/dist/formatters/json.d.ts.map +1 -0
- package/dist/formatters/json.js +17 -0
- package/dist/formatters/json.js.map +1 -0
- package/dist/formatters/sarif.d.ts +14 -0
- package/dist/formatters/sarif.d.ts.map +1 -0
- package/dist/formatters/sarif.js +108 -0
- package/dist/formatters/sarif.js.map +1 -0
- package/dist/formatters/text.d.ts +9 -0
- package/dist/formatters/text.d.ts.map +1 -0
- package/dist/formatters/text.js +128 -0
- package/dist/formatters/text.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +49 -0
- package/dist/index.js.map +1 -0
- package/dist/parsers/entitlements-parser.d.ts +26 -0
- package/dist/parsers/entitlements-parser.d.ts.map +1 -0
- package/dist/parsers/entitlements-parser.js +105 -0
- package/dist/parsers/entitlements-parser.js.map +1 -0
- package/dist/parsers/framework-detector.d.ts +76 -0
- package/dist/parsers/framework-detector.d.ts.map +1 -0
- package/dist/parsers/framework-detector.js +501 -0
- package/dist/parsers/framework-detector.js.map +1 -0
- package/dist/parsers/index.d.ts +10 -0
- package/dist/parsers/index.d.ts.map +1 -0
- package/dist/parsers/index.js +26 -0
- package/dist/parsers/index.js.map +1 -0
- package/dist/parsers/pbxproj-parser.d.ts +166 -0
- package/dist/parsers/pbxproj-parser.d.ts.map +1 -0
- package/dist/parsers/pbxproj-parser.js +423 -0
- package/dist/parsers/pbxproj-parser.js.map +1 -0
- package/dist/parsers/plist-parser.d.ts +26 -0
- package/dist/parsers/plist-parser.d.ts.map +1 -0
- package/dist/parsers/plist-parser.js +166 -0
- package/dist/parsers/plist-parser.js.map +1 -0
- package/dist/parsers/project-parser.d.ts +57 -0
- package/dist/parsers/project-parser.d.ts.map +1 -0
- package/dist/parsers/project-parser.js +618 -0
- package/dist/parsers/project-parser.js.map +1 -0
- package/dist/parsers/workspace-parser.d.ts +82 -0
- package/dist/parsers/workspace-parser.d.ts.map +1 -0
- package/dist/parsers/workspace-parser.js +287 -0
- package/dist/parsers/workspace-parser.js.map +1 -0
- package/dist/rules/auth/index.d.ts +5 -0
- package/dist/rules/auth/index.d.ts.map +1 -0
- package/dist/rules/auth/index.js +9 -0
- package/dist/rules/auth/index.js.map +1 -0
- package/dist/rules/auth/third-party-login-no-siwa.d.ts +11 -0
- package/dist/rules/auth/third-party-login-no-siwa.d.ts.map +1 -0
- package/dist/rules/auth/third-party-login-no-siwa.js +119 -0
- package/dist/rules/auth/third-party-login-no-siwa.js.map +1 -0
- package/dist/rules/base.d.ts +25 -0
- package/dist/rules/base.d.ts.map +1 -0
- package/dist/rules/base.js +37 -0
- package/dist/rules/base.js.map +1 -0
- package/dist/rules/config/ats-exception-without-justification.d.ts +12 -0
- package/dist/rules/config/ats-exception-without-justification.d.ts.map +1 -0
- package/dist/rules/config/ats-exception-without-justification.js +152 -0
- package/dist/rules/config/ats-exception-without-justification.js.map +1 -0
- package/dist/rules/config/index.d.ts +5 -0
- package/dist/rules/config/index.d.ts.map +1 -0
- package/dist/rules/config/index.js +9 -0
- package/dist/rules/config/index.js.map +1 -0
- package/dist/rules/index.d.ts +43 -0
- package/dist/rules/index.d.ts.map +1 -0
- package/dist/rules/index.js +103 -0
- package/dist/rules/index.js.map +1 -0
- package/dist/rules/metadata/index.d.ts +5 -0
- package/dist/rules/metadata/index.d.ts.map +1 -0
- package/dist/rules/metadata/index.js +9 -0
- package/dist/rules/metadata/index.js.map +1 -0
- package/dist/rules/metadata/missing-privacy-manifest.d.ts +12 -0
- package/dist/rules/metadata/missing-privacy-manifest.d.ts.map +1 -0
- package/dist/rules/metadata/missing-privacy-manifest.js +186 -0
- package/dist/rules/metadata/missing-privacy-manifest.js.map +1 -0
- package/dist/rules/privacy/att-tracking-mismatch.d.ts +12 -0
- package/dist/rules/privacy/att-tracking-mismatch.d.ts.map +1 -0
- package/dist/rules/privacy/att-tracking-mismatch.js +113 -0
- package/dist/rules/privacy/att-tracking-mismatch.js.map +1 -0
- package/dist/rules/privacy/index.d.ts +11 -0
- package/dist/rules/privacy/index.d.ts.map +1 -0
- package/dist/rules/privacy/index.js +21 -0
- package/dist/rules/privacy/index.js.map +1 -0
- package/dist/rules/privacy/location-always-unjustified.d.ts +11 -0
- package/dist/rules/privacy/location-always-unjustified.d.ts.map +1 -0
- package/dist/rules/privacy/location-always-unjustified.js +102 -0
- package/dist/rules/privacy/location-always-unjustified.js.map +1 -0
- package/dist/rules/privacy/missing-camera-purpose.d.ts +11 -0
- package/dist/rules/privacy/missing-camera-purpose.d.ts.map +1 -0
- package/dist/rules/privacy/missing-camera-purpose.js +83 -0
- package/dist/rules/privacy/missing-camera-purpose.js.map +1 -0
- package/dist/rules/privacy/missing-contacts-purpose.d.ts +11 -0
- package/dist/rules/privacy/missing-contacts-purpose.d.ts.map +1 -0
- package/dist/rules/privacy/missing-contacts-purpose.js +85 -0
- package/dist/rules/privacy/missing-contacts-purpose.js.map +1 -0
- package/dist/rules/privacy/missing-location-purpose.d.ts +12 -0
- package/dist/rules/privacy/missing-location-purpose.d.ts.map +1 -0
- package/dist/rules/privacy/missing-location-purpose.js +137 -0
- package/dist/rules/privacy/missing-location-purpose.js.map +1 -0
- package/dist/rules/privacy/missing-microphone-purpose.d.ts +11 -0
- package/dist/rules/privacy/missing-microphone-purpose.d.ts.map +1 -0
- package/dist/rules/privacy/missing-microphone-purpose.js +132 -0
- package/dist/rules/privacy/missing-microphone-purpose.js.map +1 -0
- package/dist/rules/privacy/missing-photo-library-purpose.d.ts +11 -0
- package/dist/rules/privacy/missing-photo-library-purpose.d.ts.map +1 -0
- package/dist/rules/privacy/missing-photo-library-purpose.js +102 -0
- package/dist/rules/privacy/missing-photo-library-purpose.js.map +1 -0
- package/dist/types/index.d.ts +140 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +59 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +68 -0
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.formatText = formatText;
|
|
4
|
+
const index_js_1 = require("../types/index.js");
|
|
5
|
+
// Dynamic import for chalk (ESM)
|
|
6
|
+
let chalk;
|
|
7
|
+
async function getChalk() {
|
|
8
|
+
if (!chalk) {
|
|
9
|
+
const module = await import('chalk');
|
|
10
|
+
chalk = module.default;
|
|
11
|
+
}
|
|
12
|
+
return chalk;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Get severity color
|
|
16
|
+
*/
|
|
17
|
+
function getSeverityColor(severity) {
|
|
18
|
+
switch (severity) {
|
|
19
|
+
case index_js_1.Severity.Critical:
|
|
20
|
+
return (text) => chalk.red.bold(text);
|
|
21
|
+
case index_js_1.Severity.High:
|
|
22
|
+
return (text) => chalk.red(text);
|
|
23
|
+
case index_js_1.Severity.Medium:
|
|
24
|
+
return (text) => chalk.yellow(text);
|
|
25
|
+
case index_js_1.Severity.Low:
|
|
26
|
+
return (text) => chalk.blue(text);
|
|
27
|
+
case index_js_1.Severity.Info:
|
|
28
|
+
return (text) => chalk.gray(text);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Get confidence label
|
|
33
|
+
*/
|
|
34
|
+
function getConfidenceLabel(confidence) {
|
|
35
|
+
switch (confidence) {
|
|
36
|
+
case index_js_1.Confidence.High:
|
|
37
|
+
return 'high confidence';
|
|
38
|
+
case index_js_1.Confidence.Medium:
|
|
39
|
+
return 'medium confidence';
|
|
40
|
+
case index_js_1.Confidence.Low:
|
|
41
|
+
return 'low confidence';
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Format a single finding
|
|
46
|
+
*/
|
|
47
|
+
async function formatFinding(finding, index) {
|
|
48
|
+
const c = await getChalk();
|
|
49
|
+
const severityColor = getSeverityColor(finding.severity);
|
|
50
|
+
const lines = [];
|
|
51
|
+
// Header
|
|
52
|
+
lines.push(`${c.bold(`${index + 1}.`)} ${severityColor(`[${finding.severity.toUpperCase()}]`)} ${c.bold(finding.title)}`);
|
|
53
|
+
// Location and guideline
|
|
54
|
+
const meta = [];
|
|
55
|
+
if (finding.location) {
|
|
56
|
+
meta.push(`📍 ${finding.location}`);
|
|
57
|
+
}
|
|
58
|
+
meta.push(`📋 Guideline ${finding.guideline}`);
|
|
59
|
+
meta.push(`🎯 ${getConfidenceLabel(finding.confidence)}`);
|
|
60
|
+
lines.push(c.dim(` ${meta.join(' • ')}`));
|
|
61
|
+
// Description
|
|
62
|
+
lines.push('');
|
|
63
|
+
lines.push(c.white(` ${finding.description}`));
|
|
64
|
+
// Fix guidance
|
|
65
|
+
lines.push('');
|
|
66
|
+
lines.push(c.green.bold(' How to fix:'));
|
|
67
|
+
for (const line of finding.fixGuidance.split('\n')) {
|
|
68
|
+
lines.push(c.green(` ${line}`));
|
|
69
|
+
}
|
|
70
|
+
// Documentation URL
|
|
71
|
+
if (finding.documentationURL) {
|
|
72
|
+
lines.push('');
|
|
73
|
+
lines.push(c.cyan(` 📚 ${finding.documentationURL}`));
|
|
74
|
+
}
|
|
75
|
+
return lines.join('\n');
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Format scan results as text
|
|
79
|
+
*/
|
|
80
|
+
async function formatText(result) {
|
|
81
|
+
const c = await getChalk();
|
|
82
|
+
const lines = [];
|
|
83
|
+
// Header
|
|
84
|
+
lines.push(c.bold.underline('\n🛡️ ReviewShield Scan Results\n'));
|
|
85
|
+
lines.push(`📁 Project: ${result.projectPath}`);
|
|
86
|
+
lines.push(`🕐 Scanned: ${result.timestamp.toISOString()}`);
|
|
87
|
+
lines.push(`⏱️ Duration: ${result.duration}ms`);
|
|
88
|
+
lines.push(`📊 Rules run: ${result.rulesRun.length}`);
|
|
89
|
+
lines.push('');
|
|
90
|
+
if (result.findings.length === 0) {
|
|
91
|
+
lines.push(c.green.bold('✅ No issues found! Your app looks ready for review.'));
|
|
92
|
+
lines.push('');
|
|
93
|
+
return lines.join('\n');
|
|
94
|
+
}
|
|
95
|
+
// Summary by severity
|
|
96
|
+
const bySeverity = new Map();
|
|
97
|
+
for (const finding of result.findings) {
|
|
98
|
+
const existing = bySeverity.get(finding.severity) ?? [];
|
|
99
|
+
existing.push(finding);
|
|
100
|
+
bySeverity.set(finding.severity, existing);
|
|
101
|
+
}
|
|
102
|
+
lines.push(c.bold('📊 Summary:'));
|
|
103
|
+
const severityOrder = [index_js_1.Severity.Critical, index_js_1.Severity.High, index_js_1.Severity.Medium, index_js_1.Severity.Low, index_js_1.Severity.Info];
|
|
104
|
+
for (const severity of severityOrder) {
|
|
105
|
+
const count = bySeverity.get(severity)?.length ?? 0;
|
|
106
|
+
if (count > 0) {
|
|
107
|
+
const color = getSeverityColor(severity);
|
|
108
|
+
lines.push(` ${color(`${severity.toUpperCase()}`)}: ${count}`);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
lines.push('');
|
|
112
|
+
// Findings
|
|
113
|
+
lines.push(c.bold.underline(`\n🔍 Found ${result.findings.length} issue(s):\n`));
|
|
114
|
+
// Sort by severity
|
|
115
|
+
const sortedFindings = [...result.findings].sort((a, b) => {
|
|
116
|
+
const order = { critical: 0, high: 1, medium: 2, low: 3, info: 4 };
|
|
117
|
+
return order[a.severity] - order[b.severity];
|
|
118
|
+
});
|
|
119
|
+
for (let i = 0; i < sortedFindings.length; i++) {
|
|
120
|
+
const formattedFinding = await formatFinding(sortedFindings[i], i);
|
|
121
|
+
lines.push(formattedFinding);
|
|
122
|
+
lines.push('');
|
|
123
|
+
lines.push(c.dim(' ' + '─'.repeat(60)));
|
|
124
|
+
lines.push('');
|
|
125
|
+
}
|
|
126
|
+
return lines.join('\n');
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=text.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/formatters/text.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ReviewShield - App Store Review Guideline Scanner
|
|
3
|
+
*
|
|
4
|
+
* Main library entry point for programmatic usage
|
|
5
|
+
*/
|
|
6
|
+
export * from './types/index.js';
|
|
7
|
+
export * from './parsers/index.js';
|
|
8
|
+
export { allRules, ruleRegistry, getRule, getRules, getRulesExcluding, MissingCameraPurposeRule, MissingLocationPurposeRule, LocationAlwaysUnjustifiedRule, ATTTrackingMismatchRule, ThirdPartyLoginNoSIWARule, } from './rules/index.js';
|
|
9
|
+
export { scan, scanWithContext } from './core/scanner.js';
|
|
10
|
+
export { format, formatText, formatJSON, formatSARIF } from './formatters/index.js';
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,cAAc,kBAAkB,CAAC;AAGjC,cAAc,oBAAoB,CAAC;AAGnC,OAAO,EACL,QAAQ,EACR,YAAY,EACZ,OAAO,EACP,QAAQ,EACR,iBAAiB,EACjB,wBAAwB,EACxB,0BAA0B,EAC1B,6BAA6B,EAC7B,uBAAuB,EACvB,yBAAyB,GAC1B,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAG1D,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ReviewShield - App Store Review Guideline Scanner
|
|
4
|
+
*
|
|
5
|
+
* Main library entry point for programmatic usage
|
|
6
|
+
*/
|
|
7
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
8
|
+
if (k2 === undefined) k2 = k;
|
|
9
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
10
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
11
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
12
|
+
}
|
|
13
|
+
Object.defineProperty(o, k2, desc);
|
|
14
|
+
}) : (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
o[k2] = m[k];
|
|
17
|
+
}));
|
|
18
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
19
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
20
|
+
};
|
|
21
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
+
exports.formatSARIF = exports.formatJSON = exports.formatText = exports.format = exports.scanWithContext = exports.scan = exports.ThirdPartyLoginNoSIWARule = exports.ATTTrackingMismatchRule = exports.LocationAlwaysUnjustifiedRule = exports.MissingLocationPurposeRule = exports.MissingCameraPurposeRule = exports.getRulesExcluding = exports.getRules = exports.getRule = exports.ruleRegistry = exports.allRules = void 0;
|
|
23
|
+
// Types
|
|
24
|
+
__exportStar(require("./types/index.js"), exports);
|
|
25
|
+
// Parsers
|
|
26
|
+
__exportStar(require("./parsers/index.js"), exports);
|
|
27
|
+
// Rules
|
|
28
|
+
var index_js_1 = require("./rules/index.js");
|
|
29
|
+
Object.defineProperty(exports, "allRules", { enumerable: true, get: function () { return index_js_1.allRules; } });
|
|
30
|
+
Object.defineProperty(exports, "ruleRegistry", { enumerable: true, get: function () { return index_js_1.ruleRegistry; } });
|
|
31
|
+
Object.defineProperty(exports, "getRule", { enumerable: true, get: function () { return index_js_1.getRule; } });
|
|
32
|
+
Object.defineProperty(exports, "getRules", { enumerable: true, get: function () { return index_js_1.getRules; } });
|
|
33
|
+
Object.defineProperty(exports, "getRulesExcluding", { enumerable: true, get: function () { return index_js_1.getRulesExcluding; } });
|
|
34
|
+
Object.defineProperty(exports, "MissingCameraPurposeRule", { enumerable: true, get: function () { return index_js_1.MissingCameraPurposeRule; } });
|
|
35
|
+
Object.defineProperty(exports, "MissingLocationPurposeRule", { enumerable: true, get: function () { return index_js_1.MissingLocationPurposeRule; } });
|
|
36
|
+
Object.defineProperty(exports, "LocationAlwaysUnjustifiedRule", { enumerable: true, get: function () { return index_js_1.LocationAlwaysUnjustifiedRule; } });
|
|
37
|
+
Object.defineProperty(exports, "ATTTrackingMismatchRule", { enumerable: true, get: function () { return index_js_1.ATTTrackingMismatchRule; } });
|
|
38
|
+
Object.defineProperty(exports, "ThirdPartyLoginNoSIWARule", { enumerable: true, get: function () { return index_js_1.ThirdPartyLoginNoSIWARule; } });
|
|
39
|
+
// Core
|
|
40
|
+
var scanner_js_1 = require("./core/scanner.js");
|
|
41
|
+
Object.defineProperty(exports, "scan", { enumerable: true, get: function () { return scanner_js_1.scan; } });
|
|
42
|
+
Object.defineProperty(exports, "scanWithContext", { enumerable: true, get: function () { return scanner_js_1.scanWithContext; } });
|
|
43
|
+
// Formatters
|
|
44
|
+
var index_js_2 = require("./formatters/index.js");
|
|
45
|
+
Object.defineProperty(exports, "format", { enumerable: true, get: function () { return index_js_2.format; } });
|
|
46
|
+
Object.defineProperty(exports, "formatText", { enumerable: true, get: function () { return index_js_2.formatText; } });
|
|
47
|
+
Object.defineProperty(exports, "formatJSON", { enumerable: true, get: function () { return index_js_2.formatJSON; } });
|
|
48
|
+
Object.defineProperty(exports, "formatSARIF", { enumerable: true, get: function () { return index_js_2.formatSARIF; } });
|
|
49
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;;;;;;;;;;;;;AAEH,QAAQ;AACR,mDAAiC;AAEjC,UAAU;AACV,qDAAmC;AAEnC,QAAQ;AACR,6CAW0B;AAVxB,oGAAA,QAAQ,OAAA;AACR,wGAAA,YAAY,OAAA;AACZ,mGAAA,OAAO,OAAA;AACP,oGAAA,QAAQ,OAAA;AACR,6GAAA,iBAAiB,OAAA;AACjB,oHAAA,wBAAwB,OAAA;AACxB,sHAAA,0BAA0B,OAAA;AAC1B,yHAAA,6BAA6B,OAAA;AAC7B,mHAAA,uBAAuB,OAAA;AACvB,qHAAA,yBAAyB,OAAA;AAG3B,OAAO;AACP,gDAA0D;AAAjD,kGAAA,IAAI,OAAA;AAAE,6GAAA,eAAe,OAAA;AAE9B,aAAa;AACb,kDAAoF;AAA3E,kGAAA,MAAM,OAAA;AAAE,sGAAA,UAAU,OAAA;AAAE,sGAAA,UAAU,OAAA;AAAE,uGAAA,WAAW,OAAA"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Well-known entitlement keys
|
|
3
|
+
*/
|
|
4
|
+
export declare const EntitlementKeys: {
|
|
5
|
+
readonly signInWithApple: "com.apple.developer.applesignin";
|
|
6
|
+
readonly pushNotifications: "aps-environment";
|
|
7
|
+
readonly iCloudContainer: "com.apple.developer.icloud-container-identifiers";
|
|
8
|
+
readonly appGroups: "com.apple.security.application-groups";
|
|
9
|
+
readonly associatedDomains: "com.apple.developer.associated-domains";
|
|
10
|
+
readonly healthKit: "com.apple.developer.healthkit";
|
|
11
|
+
readonly homeKit: "com.apple.developer.homekit";
|
|
12
|
+
readonly networkExtensions: "com.apple.developer.networking.networkextension";
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Parses an entitlements file at the given path
|
|
16
|
+
*/
|
|
17
|
+
export declare function parseEntitlements(filePath: string): Record<string, unknown>;
|
|
18
|
+
/**
|
|
19
|
+
* Parses entitlements from a string
|
|
20
|
+
*/
|
|
21
|
+
export declare function parseEntitlementsString(content: string): Record<string, unknown>;
|
|
22
|
+
/**
|
|
23
|
+
* Checks if Sign in with Apple capability is enabled
|
|
24
|
+
*/
|
|
25
|
+
export declare function hasSignInWithApple(entitlements: Record<string, unknown>): boolean;
|
|
26
|
+
//# sourceMappingURL=entitlements-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entitlements-parser.d.ts","sourceRoot":"","sources":["../../src/parsers/entitlements-parser.ts"],"names":[],"mappings":"AAMA;;GAEG;AACH,eAAO,MAAM,eAAe;;;;;;;;;CASlB,CAAC;AAEX;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAgB3E;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAUhF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAQjF"}
|
|
@@ -0,0 +1,105 @@
|
|
|
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
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.EntitlementKeys = void 0;
|
|
40
|
+
exports.parseEntitlements = parseEntitlements;
|
|
41
|
+
exports.parseEntitlementsString = parseEntitlementsString;
|
|
42
|
+
exports.hasSignInWithApple = hasSignInWithApple;
|
|
43
|
+
/**
|
|
44
|
+
* Parser for entitlements (.entitlements) files
|
|
45
|
+
*/
|
|
46
|
+
const fs = __importStar(require("fs"));
|
|
47
|
+
const plist_1 = __importDefault(require("plist"));
|
|
48
|
+
/**
|
|
49
|
+
* Well-known entitlement keys
|
|
50
|
+
*/
|
|
51
|
+
exports.EntitlementKeys = {
|
|
52
|
+
signInWithApple: 'com.apple.developer.applesignin',
|
|
53
|
+
pushNotifications: 'aps-environment',
|
|
54
|
+
iCloudContainer: 'com.apple.developer.icloud-container-identifiers',
|
|
55
|
+
appGroups: 'com.apple.security.application-groups',
|
|
56
|
+
associatedDomains: 'com.apple.developer.associated-domains',
|
|
57
|
+
healthKit: 'com.apple.developer.healthkit',
|
|
58
|
+
homeKit: 'com.apple.developer.homekit',
|
|
59
|
+
networkExtensions: 'com.apple.developer.networking.networkextension',
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* Parses an entitlements file at the given path
|
|
63
|
+
*/
|
|
64
|
+
function parseEntitlements(filePath) {
|
|
65
|
+
if (!fs.existsSync(filePath)) {
|
|
66
|
+
throw new Error(`Entitlements file not found at: ${filePath}`);
|
|
67
|
+
}
|
|
68
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
69
|
+
try {
|
|
70
|
+
const parsed = plist_1.default.parse(content);
|
|
71
|
+
if (typeof parsed !== 'object' || parsed === null) {
|
|
72
|
+
throw new Error('Root is not a dictionary');
|
|
73
|
+
}
|
|
74
|
+
return parsed;
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
throw new Error(`Invalid entitlements format at ${filePath}: ${error}`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Parses entitlements from a string
|
|
82
|
+
*/
|
|
83
|
+
function parseEntitlementsString(content) {
|
|
84
|
+
try {
|
|
85
|
+
const parsed = plist_1.default.parse(content);
|
|
86
|
+
if (typeof parsed !== 'object' || parsed === null) {
|
|
87
|
+
throw new Error('Root is not a dictionary');
|
|
88
|
+
}
|
|
89
|
+
return parsed;
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
throw new Error(`Invalid entitlements format: ${error}`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Checks if Sign in with Apple capability is enabled
|
|
97
|
+
*/
|
|
98
|
+
function hasSignInWithApple(entitlements) {
|
|
99
|
+
const siwaValue = entitlements[exports.EntitlementKeys.signInWithApple];
|
|
100
|
+
if (Array.isArray(siwaValue)) {
|
|
101
|
+
return siwaValue.includes('Default');
|
|
102
|
+
}
|
|
103
|
+
return siwaValue !== undefined && siwaValue !== null;
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=entitlements-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entitlements-parser.js","sourceRoot":"","sources":["../../src/parsers/entitlements-parser.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuBA,8CAgBC;AAKD,0DAUC;AAKD,gDAQC;AAnED;;GAEG;AACH,uCAAyB;AACzB,kDAA0B;AAE1B;;GAEG;AACU,QAAA,eAAe,GAAG;IAC7B,eAAe,EAAE,iCAAiC;IAClD,iBAAiB,EAAE,iBAAiB;IACpC,eAAe,EAAE,kDAAkD;IACnE,SAAS,EAAE,uCAAuC;IAClD,iBAAiB,EAAE,wCAAwC;IAC3D,SAAS,EAAE,+BAA+B;IAC1C,OAAO,EAAE,6BAA6B;IACtC,iBAAiB,EAAE,iDAAiD;CAC5D,CAAC;AAEX;;GAEG;AACH,SAAgB,iBAAiB,CAAC,QAAgB;IAChD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,mCAAmC,QAAQ,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAEnD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,eAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACpC,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YAClD,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC9C,CAAC;QACD,OAAO,MAAiC,CAAC;IAC3C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,kCAAkC,QAAQ,KAAK,KAAK,EAAE,CAAC,CAAC;IAC1E,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,uBAAuB,CAAC,OAAe;IACrD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,eAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACpC,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YAClD,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC9C,CAAC;QACD,OAAO,MAAiC,CAAC;IAC3C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,gCAAgC,KAAK,EAAE,CAAC,CAAC;IAC3D,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,kBAAkB,CAAC,YAAqC;IACtE,MAAM,SAAS,GAAG,YAAY,CAAC,uBAAe,CAAC,eAAe,CAAC,CAAC;IAEhE,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7B,OAAO,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IACvC,CAAC;IAED,OAAO,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,IAAI,CAAC;AACvD,CAAC"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { Dependency } from '../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Known tracking SDK patterns for ATT detection
|
|
4
|
+
*/
|
|
5
|
+
export declare const trackingSDKPatterns: Array<{
|
|
6
|
+
pattern: string;
|
|
7
|
+
name: string;
|
|
8
|
+
}>;
|
|
9
|
+
/**
|
|
10
|
+
* Known social login SDK patterns for SIWA detection
|
|
11
|
+
*/
|
|
12
|
+
export declare const socialLoginSDKPatterns: Array<{
|
|
13
|
+
pattern: string;
|
|
14
|
+
name: string;
|
|
15
|
+
}>;
|
|
16
|
+
/**
|
|
17
|
+
* Location-related frameworks
|
|
18
|
+
*/
|
|
19
|
+
export declare const locationFrameworks: Set<string>;
|
|
20
|
+
/**
|
|
21
|
+
* Camera-related frameworks
|
|
22
|
+
*/
|
|
23
|
+
export declare const cameraFrameworks: Set<string>;
|
|
24
|
+
/**
|
|
25
|
+
* Parses Podfile.lock to extract CocoaPods dependencies
|
|
26
|
+
*/
|
|
27
|
+
export declare function parsePodfileLock(filePath: string): Dependency[];
|
|
28
|
+
/**
|
|
29
|
+
* Parses Podfile.lock content string
|
|
30
|
+
*/
|
|
31
|
+
export declare function parsePodfileLockContent(content: string): Dependency[];
|
|
32
|
+
/**
|
|
33
|
+
* Parses Package.resolved to extract SPM dependencies
|
|
34
|
+
*/
|
|
35
|
+
export declare function parsePackageResolved(filePath: string): Dependency[];
|
|
36
|
+
/**
|
|
37
|
+
* Parses Package.resolved JSON data
|
|
38
|
+
*/
|
|
39
|
+
export declare function parsePackageResolvedData(json: Record<string, unknown>): Dependency[];
|
|
40
|
+
/**
|
|
41
|
+
* Parses project.pbxproj to extract linked frameworks
|
|
42
|
+
*/
|
|
43
|
+
export declare function parseProjectFrameworks(filePath: string): Set<string>;
|
|
44
|
+
/**
|
|
45
|
+
* Parses project.pbxproj content to extract linked frameworks
|
|
46
|
+
*/
|
|
47
|
+
export declare function parseProjectFrameworksContent(content: string): Set<string>;
|
|
48
|
+
/**
|
|
49
|
+
* Detects tracking SDKs from a list of dependencies
|
|
50
|
+
*/
|
|
51
|
+
export declare function detectTrackingSDKs(dependencies: Dependency[]): string[];
|
|
52
|
+
/**
|
|
53
|
+
* Detects social login SDKs from a list of dependencies
|
|
54
|
+
*/
|
|
55
|
+
export declare function detectSocialLoginSDKs(dependencies: Dependency[]): string[];
|
|
56
|
+
/**
|
|
57
|
+
* P2-C FIX: Loads dependencies for a specific .xcodeproj, avoiding recursive scan of whole parent
|
|
58
|
+
*
|
|
59
|
+
* Searches lockfiles only in:
|
|
60
|
+
* 1. The .xcodeproj directory itself (project.xcworkspace/xcshareddata/swiftpm/Package.resolved)
|
|
61
|
+
* 2. The parent directory of the .xcodeproj
|
|
62
|
+
* 3. The parent's .swiftpm directory
|
|
63
|
+
*
|
|
64
|
+
* This prevents picking up lockfiles from sibling projects in monorepos.
|
|
65
|
+
*
|
|
66
|
+
* @param xcodeprojPath Path to the .xcodeproj directory
|
|
67
|
+
* @returns Array of dependencies found
|
|
68
|
+
*/
|
|
69
|
+
export declare function loadDependenciesForProject(xcodeprojPath: string): Dependency[];
|
|
70
|
+
/**
|
|
71
|
+
* Loads all dependencies from a project directory
|
|
72
|
+
* BUG FIX #3: Now searches recursively for lockfiles
|
|
73
|
+
* P2-C FIX: When given a .xcodeproj path, uses scoped search to prevent monorepo bleeding
|
|
74
|
+
*/
|
|
75
|
+
export declare function loadAllDependencies(projectDir: string): Dependency[];
|
|
76
|
+
//# sourceMappingURL=framework-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"framework-detector.d.ts","sourceRoot":"","sources":["../../src/parsers/framework-detector.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,UAAU,EAAoB,MAAM,mBAAmB,CAAC;AAEjE;;GAEG;AACH,eAAO,MAAM,mBAAmB,EAAE,KAAK,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAuBxE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,sBAAsB,EAAE,KAAK,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAkB3E,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,kBAAkB,EAAE,GAAG,CAAC,MAAM,CAGzC,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAIvC,CAAC;AAEH;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,EAAE,CAO/D;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,EAAE,CA0DrE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,EAAE,CAanE;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,UAAU,EAAE,CAsCpF;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAOpE;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAY1E;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,UAAU,EAAE,GAAG,MAAM,EAAE,CAavE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,UAAU,EAAE,GAAG,MAAM,EAAE,CAa1E;AA8FD;;;;;;;;;;;;GAYG;AACH,wBAAgB,0BAA0B,CAAC,aAAa,EAAE,MAAM,GAAG,UAAU,EAAE,CAoE9E;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,EAAE,CAqFpE"}
|