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.
Files changed (130) hide show
  1. package/README.md +107 -0
  2. package/dist/cli/index.d.ts +3 -0
  3. package/dist/cli/index.d.ts.map +1 -0
  4. package/dist/cli/index.js +101 -0
  5. package/dist/cli/index.js.map +1 -0
  6. package/dist/core/index.d.ts +5 -0
  7. package/dist/core/index.d.ts.map +1 -0
  8. package/dist/core/index.js +21 -0
  9. package/dist/core/index.js.map +1 -0
  10. package/dist/core/scanner.d.ts +27 -0
  11. package/dist/core/scanner.d.ts.map +1 -0
  12. package/dist/core/scanner.js +104 -0
  13. package/dist/core/scanner.js.map +1 -0
  14. package/dist/formatters/index.d.ts +13 -0
  15. package/dist/formatters/index.d.ts.map +1 -0
  16. package/dist/formatters/index.js +29 -0
  17. package/dist/formatters/index.js.map +1 -0
  18. package/dist/formatters/json.d.ts +13 -0
  19. package/dist/formatters/json.d.ts.map +1 -0
  20. package/dist/formatters/json.js +17 -0
  21. package/dist/formatters/json.js.map +1 -0
  22. package/dist/formatters/sarif.d.ts +14 -0
  23. package/dist/formatters/sarif.d.ts.map +1 -0
  24. package/dist/formatters/sarif.js +108 -0
  25. package/dist/formatters/sarif.js.map +1 -0
  26. package/dist/formatters/text.d.ts +9 -0
  27. package/dist/formatters/text.d.ts.map +1 -0
  28. package/dist/formatters/text.js +128 -0
  29. package/dist/formatters/text.js.map +1 -0
  30. package/dist/index.d.ts +11 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +49 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/parsers/entitlements-parser.d.ts +26 -0
  35. package/dist/parsers/entitlements-parser.d.ts.map +1 -0
  36. package/dist/parsers/entitlements-parser.js +105 -0
  37. package/dist/parsers/entitlements-parser.js.map +1 -0
  38. package/dist/parsers/framework-detector.d.ts +76 -0
  39. package/dist/parsers/framework-detector.d.ts.map +1 -0
  40. package/dist/parsers/framework-detector.js +501 -0
  41. package/dist/parsers/framework-detector.js.map +1 -0
  42. package/dist/parsers/index.d.ts +10 -0
  43. package/dist/parsers/index.d.ts.map +1 -0
  44. package/dist/parsers/index.js +26 -0
  45. package/dist/parsers/index.js.map +1 -0
  46. package/dist/parsers/pbxproj-parser.d.ts +166 -0
  47. package/dist/parsers/pbxproj-parser.d.ts.map +1 -0
  48. package/dist/parsers/pbxproj-parser.js +423 -0
  49. package/dist/parsers/pbxproj-parser.js.map +1 -0
  50. package/dist/parsers/plist-parser.d.ts +26 -0
  51. package/dist/parsers/plist-parser.d.ts.map +1 -0
  52. package/dist/parsers/plist-parser.js +166 -0
  53. package/dist/parsers/plist-parser.js.map +1 -0
  54. package/dist/parsers/project-parser.d.ts +57 -0
  55. package/dist/parsers/project-parser.d.ts.map +1 -0
  56. package/dist/parsers/project-parser.js +618 -0
  57. package/dist/parsers/project-parser.js.map +1 -0
  58. package/dist/parsers/workspace-parser.d.ts +82 -0
  59. package/dist/parsers/workspace-parser.d.ts.map +1 -0
  60. package/dist/parsers/workspace-parser.js +287 -0
  61. package/dist/parsers/workspace-parser.js.map +1 -0
  62. package/dist/rules/auth/index.d.ts +5 -0
  63. package/dist/rules/auth/index.d.ts.map +1 -0
  64. package/dist/rules/auth/index.js +9 -0
  65. package/dist/rules/auth/index.js.map +1 -0
  66. package/dist/rules/auth/third-party-login-no-siwa.d.ts +11 -0
  67. package/dist/rules/auth/third-party-login-no-siwa.d.ts.map +1 -0
  68. package/dist/rules/auth/third-party-login-no-siwa.js +119 -0
  69. package/dist/rules/auth/third-party-login-no-siwa.js.map +1 -0
  70. package/dist/rules/base.d.ts +25 -0
  71. package/dist/rules/base.d.ts.map +1 -0
  72. package/dist/rules/base.js +37 -0
  73. package/dist/rules/base.js.map +1 -0
  74. package/dist/rules/config/ats-exception-without-justification.d.ts +12 -0
  75. package/dist/rules/config/ats-exception-without-justification.d.ts.map +1 -0
  76. package/dist/rules/config/ats-exception-without-justification.js +152 -0
  77. package/dist/rules/config/ats-exception-without-justification.js.map +1 -0
  78. package/dist/rules/config/index.d.ts +5 -0
  79. package/dist/rules/config/index.d.ts.map +1 -0
  80. package/dist/rules/config/index.js +9 -0
  81. package/dist/rules/config/index.js.map +1 -0
  82. package/dist/rules/index.d.ts +43 -0
  83. package/dist/rules/index.d.ts.map +1 -0
  84. package/dist/rules/index.js +103 -0
  85. package/dist/rules/index.js.map +1 -0
  86. package/dist/rules/metadata/index.d.ts +5 -0
  87. package/dist/rules/metadata/index.d.ts.map +1 -0
  88. package/dist/rules/metadata/index.js +9 -0
  89. package/dist/rules/metadata/index.js.map +1 -0
  90. package/dist/rules/metadata/missing-privacy-manifest.d.ts +12 -0
  91. package/dist/rules/metadata/missing-privacy-manifest.d.ts.map +1 -0
  92. package/dist/rules/metadata/missing-privacy-manifest.js +186 -0
  93. package/dist/rules/metadata/missing-privacy-manifest.js.map +1 -0
  94. package/dist/rules/privacy/att-tracking-mismatch.d.ts +12 -0
  95. package/dist/rules/privacy/att-tracking-mismatch.d.ts.map +1 -0
  96. package/dist/rules/privacy/att-tracking-mismatch.js +113 -0
  97. package/dist/rules/privacy/att-tracking-mismatch.js.map +1 -0
  98. package/dist/rules/privacy/index.d.ts +11 -0
  99. package/dist/rules/privacy/index.d.ts.map +1 -0
  100. package/dist/rules/privacy/index.js +21 -0
  101. package/dist/rules/privacy/index.js.map +1 -0
  102. package/dist/rules/privacy/location-always-unjustified.d.ts +11 -0
  103. package/dist/rules/privacy/location-always-unjustified.d.ts.map +1 -0
  104. package/dist/rules/privacy/location-always-unjustified.js +102 -0
  105. package/dist/rules/privacy/location-always-unjustified.js.map +1 -0
  106. package/dist/rules/privacy/missing-camera-purpose.d.ts +11 -0
  107. package/dist/rules/privacy/missing-camera-purpose.d.ts.map +1 -0
  108. package/dist/rules/privacy/missing-camera-purpose.js +83 -0
  109. package/dist/rules/privacy/missing-camera-purpose.js.map +1 -0
  110. package/dist/rules/privacy/missing-contacts-purpose.d.ts +11 -0
  111. package/dist/rules/privacy/missing-contacts-purpose.d.ts.map +1 -0
  112. package/dist/rules/privacy/missing-contacts-purpose.js +85 -0
  113. package/dist/rules/privacy/missing-contacts-purpose.js.map +1 -0
  114. package/dist/rules/privacy/missing-location-purpose.d.ts +12 -0
  115. package/dist/rules/privacy/missing-location-purpose.d.ts.map +1 -0
  116. package/dist/rules/privacy/missing-location-purpose.js +137 -0
  117. package/dist/rules/privacy/missing-location-purpose.js.map +1 -0
  118. package/dist/rules/privacy/missing-microphone-purpose.d.ts +11 -0
  119. package/dist/rules/privacy/missing-microphone-purpose.d.ts.map +1 -0
  120. package/dist/rules/privacy/missing-microphone-purpose.js +132 -0
  121. package/dist/rules/privacy/missing-microphone-purpose.js.map +1 -0
  122. package/dist/rules/privacy/missing-photo-library-purpose.d.ts +11 -0
  123. package/dist/rules/privacy/missing-photo-library-purpose.d.ts.map +1 -0
  124. package/dist/rules/privacy/missing-photo-library-purpose.js +102 -0
  125. package/dist/rules/privacy/missing-photo-library-purpose.js.map +1 -0
  126. package/dist/types/index.d.ts +140 -0
  127. package/dist/types/index.d.ts.map +1 -0
  128. package/dist/types/index.js +59 -0
  129. package/dist/types/index.js.map +1 -0
  130. 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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"}
@@ -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"}