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,618 @@
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.parsePbxprojForArtifacts = parsePbxprojForArtifacts;
37
+ exports.discoverProject = discoverProject;
38
+ exports.createScanContext = createScanContext;
39
+ exports.createContextObject = createContextObject;
40
+ /**
41
+ * Parser for Xcode project structure
42
+ *
43
+ * P1/P2 Fix: Now parses actual project files instead of relying on directory heuristics.
44
+ * - Workspaces: Parses contents.xcworkspacedata for project references
45
+ * - Projects: Parses project.pbxproj for explicit artifact paths (Info.plist, entitlements)
46
+ * - Uses product type to identify main app target (not name-based heuristics)
47
+ * - Falls back to directory heuristics only when parsing fails
48
+ */
49
+ const fs = __importStar(require("fs"));
50
+ const path = __importStar(require("path"));
51
+ const plist_parser_js_1 = require("./plist-parser.js");
52
+ const entitlements_parser_js_1 = require("./entitlements-parser.js");
53
+ const framework_detector_js_1 = require("./framework-detector.js");
54
+ const workspace_parser_js_1 = require("./workspace-parser.js");
55
+ const pbxproj_parser_js_1 = require("./pbxproj-parser.js");
56
+ /**
57
+ * Maximum depth for recursive directory searches
58
+ */
59
+ const MAX_SEARCH_DEPTH = 5;
60
+ /**
61
+ * Check if a directory contains a .xcodeproj that is different from the current one
62
+ */
63
+ function containsSiblingXcodeproj(dir, currentXcodeprojPath) {
64
+ if (!currentXcodeprojPath)
65
+ return false;
66
+ try {
67
+ const entries = fs.readdirSync(dir);
68
+ for (const entry of entries) {
69
+ if (entry.endsWith('.xcodeproj')) {
70
+ const xcprojPath = path.join(dir, entry);
71
+ // Normalize paths for comparison
72
+ if (path.resolve(xcprojPath) !== path.resolve(currentXcodeprojPath)) {
73
+ return true;
74
+ }
75
+ }
76
+ }
77
+ }
78
+ catch {
79
+ // Ignore errors
80
+ }
81
+ return false;
82
+ }
83
+ /**
84
+ * P2-C FIX: Check if a directory contains multiple .xcodeproj bundles (monorepo indicator)
85
+ * Used to skip root-level artifact fallback checks in monorepos
86
+ */
87
+ function hasMultipleXcodeprojs(dir) {
88
+ try {
89
+ const entries = fs.readdirSync(dir);
90
+ let count = 0;
91
+ for (const entry of entries) {
92
+ if (entry.endsWith('.xcodeproj') && !entry.includes('Pods')) {
93
+ count++;
94
+ if (count >= 2)
95
+ return true;
96
+ }
97
+ }
98
+ }
99
+ catch {
100
+ // Ignore errors
101
+ }
102
+ return false;
103
+ }
104
+ /**
105
+ * Recursively find files matching a pattern
106
+ * P2-B FIX: Can exclude directories containing sibling .xcodeproj files
107
+ */
108
+ function findFilesRecursive(dir, predicate, options = {}, currentDepth = 0) {
109
+ const maxDepth = options.maxDepth ?? MAX_SEARCH_DEPTH;
110
+ if (currentDepth >= maxDepth)
111
+ return [];
112
+ const results = [];
113
+ try {
114
+ const entries = fs.readdirSync(dir);
115
+ for (const entry of entries) {
116
+ const fullPath = path.join(dir, entry);
117
+ // Skip common non-project directories for performance
118
+ if (entry === 'node_modules' || entry === '.git' || entry === 'Pods' ||
119
+ entry === 'build' || entry === 'DerivedData' || entry === '.build') {
120
+ continue;
121
+ }
122
+ if (predicate(entry, fullPath)) {
123
+ results.push(fullPath);
124
+ }
125
+ // Recurse into directories (but not into .xcodeproj/.xcworkspace bundles)
126
+ try {
127
+ const stat = fs.statSync(fullPath);
128
+ if (stat.isDirectory() &&
129
+ !entry.endsWith('.xcodeproj') &&
130
+ !entry.endsWith('.xcworkspace') &&
131
+ !entry.endsWith('.app') &&
132
+ !entry.endsWith('.framework')) {
133
+ // P2-B FIX: Skip directories that contain a different .xcodeproj (sibling projects)
134
+ if (options.currentXcodeprojPath && containsSiblingXcodeproj(fullPath, options.currentXcodeprojPath)) {
135
+ continue;
136
+ }
137
+ results.push(...findFilesRecursive(fullPath, predicate, options, currentDepth + 1));
138
+ }
139
+ }
140
+ catch {
141
+ // Ignore stat errors (permissions, etc.)
142
+ }
143
+ }
144
+ }
145
+ catch {
146
+ // Ignore readdir errors
147
+ }
148
+ return results;
149
+ }
150
+ /**
151
+ * P1/P2 FIX: Parse project.pbxproj to extract explicit artifact paths
152
+ *
153
+ * Now uses proper target graph parsing to:
154
+ * 1. Find all PBXNativeTarget entries
155
+ * 2. Select main app target by productType (not name heuristics)
156
+ * 3. Get build settings from the correct target's configuration
157
+ * 4. Handle Xcode path variables properly
158
+ *
159
+ * @param pbxprojPath Path to project.pbxproj file
160
+ * @param projectDir Directory containing the .xcodeproj
161
+ * @returns Resolved artifact paths
162
+ */
163
+ function parsePbxprojForArtifacts(pbxprojPath, projectDir) {
164
+ const result = {};
165
+ if (!fs.existsSync(pbxprojPath)) {
166
+ return result;
167
+ }
168
+ try {
169
+ const content = fs.readFileSync(pbxprojPath, 'utf-8');
170
+ // Extract project name from the directory path for target matching
171
+ const projectName = path.basename(path.dirname(pbxprojPath)).replace('.xcodeproj', '');
172
+ // Use the new target-aware parsing
173
+ const artifacts = (0, pbxproj_parser_js_1.getMainTargetArtifacts)(content, projectName, projectDir);
174
+ if (artifacts.target) {
175
+ result.targetName = artifacts.target.name;
176
+ }
177
+ // Validate paths exist before returning them
178
+ if (artifacts.infoPlistPath && fs.existsSync(artifacts.infoPlistPath)) {
179
+ result.infoPlistPath = artifacts.infoPlistPath;
180
+ }
181
+ if (artifacts.entitlementsPath && fs.existsSync(artifacts.entitlementsPath)) {
182
+ result.entitlementsPath = artifacts.entitlementsPath;
183
+ }
184
+ // If target-aware parsing didn't find paths, fall back to simple regex
185
+ // This handles edge cases where the pbxproj format is unusual
186
+ if (!result.infoPlistPath || !result.entitlementsPath) {
187
+ const fallback = parsePbxprojForArtifactsFallback(content, projectDir);
188
+ if (!result.infoPlistPath && fallback.infoPlistPath) {
189
+ result.infoPlistPath = fallback.infoPlistPath;
190
+ }
191
+ if (!result.entitlementsPath && fallback.entitlementsPath) {
192
+ result.entitlementsPath = fallback.entitlementsPath;
193
+ }
194
+ }
195
+ }
196
+ catch (error) {
197
+ // Parsing failed - return empty result, caller will fall back to heuristics
198
+ console.warn(`Warning: Could not parse pbxproj for artifacts: ${error}`);
199
+ }
200
+ return result;
201
+ }
202
+ /**
203
+ * Fallback parser using simple regex (for unusual pbxproj formats)
204
+ *
205
+ * This is the old implementation, kept as fallback.
206
+ */
207
+ function parsePbxprojForArtifactsFallback(content, projectDir) {
208
+ const result = {};
209
+ // Find INFOPLIST_FILE - may have quotes or not
210
+ const infoPlistMatch = content.match(/INFOPLIST_FILE\s*=\s*"?([^";]+)"?\s*;/);
211
+ if (infoPlistMatch) {
212
+ const plistPath = (0, pbxproj_parser_js_1.normalizeXcodePath)(infoPlistMatch[1].trim());
213
+ const resolvedPath = path.resolve(projectDir, plistPath);
214
+ if (fs.existsSync(resolvedPath)) {
215
+ result.infoPlistPath = resolvedPath;
216
+ }
217
+ }
218
+ // Find CODE_SIGN_ENTITLEMENTS
219
+ const entitlementsMatch = content.match(/CODE_SIGN_ENTITLEMENTS\s*=\s*"?([^";]+)"?\s*;/);
220
+ if (entitlementsMatch) {
221
+ const entPath = (0, pbxproj_parser_js_1.normalizeXcodePath)(entitlementsMatch[1].trim());
222
+ const resolvedPath = path.resolve(projectDir, entPath);
223
+ if (fs.existsSync(resolvedPath)) {
224
+ result.entitlementsPath = resolvedPath;
225
+ }
226
+ }
227
+ return result;
228
+ }
229
+ /**
230
+ * Discovers project files in a directory
231
+ *
232
+ * P1/P2 Fix: Now uses workspace parsing and explicit artifact paths
233
+ */
234
+ function discoverProject(inputPath) {
235
+ const stat = fs.statSync(inputPath);
236
+ if (stat.isFile() && inputPath.endsWith('.ipa')) {
237
+ throw new Error('IPA scanning is not yet supported. Please extract the IPA and point to the extracted app.');
238
+ }
239
+ // BUG FIX #1: Handle direct .xcodeproj path
240
+ // If the input IS a .xcodeproj directory, use it directly
241
+ if (stat.isDirectory() && inputPath.endsWith('.xcodeproj')) {
242
+ const pbxprojPath = path.join(inputPath, 'project.pbxproj');
243
+ const basePath = path.dirname(inputPath);
244
+ const discovery = {
245
+ projectPath: basePath,
246
+ // P2 FIX: Scope is the parent of .xcodeproj
247
+ projectScopeDir: basePath,
248
+ // P2-A FIX: Dependency scope is the .xcodeproj itself to prevent picking up sibling lockfiles
249
+ dependencyScopeDir: inputPath,
250
+ isWorkspace: false,
251
+ };
252
+ if (fs.existsSync(pbxprojPath)) {
253
+ discovery.pbxprojPath = pbxprojPath;
254
+ // P2 FIX: Try to get explicit artifact paths from pbxproj
255
+ const artifacts = parsePbxprojForArtifacts(pbxprojPath, basePath);
256
+ if (artifacts.targetName) {
257
+ discovery.targetName = artifacts.targetName;
258
+ }
259
+ if (artifacts.infoPlistPath) {
260
+ discovery.infoPlistPath = artifacts.infoPlistPath;
261
+ }
262
+ if (artifacts.entitlementsPath) {
263
+ discovery.entitlementsPath = artifacts.entitlementsPath;
264
+ }
265
+ }
266
+ // Fall back to directory search if artifacts not found via parsing
267
+ // P2 FIX: Pass targetName to scope the search and prevent monorepo bleeding
268
+ if (!discovery.infoPlistPath) {
269
+ discoverInfoPlist(basePath, discovery, discovery.targetName);
270
+ }
271
+ if (!discovery.entitlementsPath) {
272
+ discoverEntitlements(basePath, discovery, discovery.targetName);
273
+ }
274
+ return discovery;
275
+ }
276
+ // P1 FIX: Handle .xcworkspace by parsing contents.xcworkspacedata
277
+ if (stat.isDirectory() && inputPath.endsWith('.xcworkspace')) {
278
+ const basePath = path.dirname(inputPath);
279
+ const discovery = {
280
+ projectPath: basePath,
281
+ isWorkspace: true,
282
+ };
283
+ // P1 FIX: Parse workspace data to get actual project references
284
+ try {
285
+ const workspaceProjects = (0, workspace_parser_js_1.getWorkspaceProjects)(inputPath);
286
+ discovery.workspaceProjects = workspaceProjects;
287
+ if (workspaceProjects.length > 0) {
288
+ // Use the first main project
289
+ const mainProject = workspaceProjects[0];
290
+ const pbxprojPath = path.join(mainProject, 'project.pbxproj');
291
+ if (fs.existsSync(pbxprojPath)) {
292
+ discovery.pbxprojPath = pbxprojPath;
293
+ discovery.projectScopeDir = path.dirname(mainProject);
294
+ // P1 FIX: Set dependencyScopeDir for workspace scans to prevent picking up sibling lockfiles
295
+ discovery.dependencyScopeDir = mainProject;
296
+ // P2 FIX: Get artifacts from pbxproj
297
+ const artifacts = parsePbxprojForArtifacts(pbxprojPath, path.dirname(mainProject));
298
+ if (artifacts.targetName) {
299
+ discovery.targetName = artifacts.targetName;
300
+ }
301
+ if (artifacts.infoPlistPath) {
302
+ discovery.infoPlistPath = artifacts.infoPlistPath;
303
+ }
304
+ if (artifacts.entitlementsPath) {
305
+ discovery.entitlementsPath = artifacts.entitlementsPath;
306
+ }
307
+ }
308
+ }
309
+ }
310
+ catch (error) {
311
+ // Workspace parsing failed - fall back to directory scan
312
+ console.warn(`Warning: Workspace parsing failed, using directory scan: ${error}`);
313
+ }
314
+ // Fall back to directory scan if workspace parsing didn't find projects
315
+ if (!discovery.pbxprojPath) {
316
+ const xcodeprojs = findFilesRecursive(basePath, (name) => name.endsWith('.xcodeproj'));
317
+ // Filter out Pods
318
+ const mainXcodeprojs = xcodeprojs.filter(p => !p.includes('/Pods/') && !p.endsWith('Pods.xcodeproj'));
319
+ const projectList = mainXcodeprojs.length > 0 ? mainXcodeprojs : xcodeprojs;
320
+ for (const xcodeprojPath of projectList) {
321
+ const pbxprojPath = path.join(xcodeprojPath, 'project.pbxproj');
322
+ if (fs.existsSync(pbxprojPath)) {
323
+ discovery.pbxprojPath = pbxprojPath;
324
+ discovery.projectScopeDir = path.dirname(xcodeprojPath);
325
+ // P1 FIX: Set dependencyScopeDir for workspace fallback scans
326
+ discovery.dependencyScopeDir = xcodeprojPath;
327
+ // P2 FIX: Try to get artifacts from pbxproj
328
+ const artifacts = parsePbxprojForArtifacts(pbxprojPath, path.dirname(xcodeprojPath));
329
+ if (artifacts.targetName) {
330
+ discovery.targetName = artifacts.targetName;
331
+ }
332
+ if (artifacts.infoPlistPath) {
333
+ discovery.infoPlistPath = artifacts.infoPlistPath;
334
+ }
335
+ if (artifacts.entitlementsPath) {
336
+ discovery.entitlementsPath = artifacts.entitlementsPath;
337
+ }
338
+ break;
339
+ }
340
+ }
341
+ }
342
+ // P2 FIX: Search for artifacts within the project scope, not the entire basePath
343
+ // Pass targetName to scope the search and prevent monorepo bleeding
344
+ const artifactSearchDir = discovery.projectScopeDir || basePath;
345
+ if (!discovery.infoPlistPath) {
346
+ discoverInfoPlist(artifactSearchDir, discovery, discovery.targetName);
347
+ }
348
+ if (!discovery.entitlementsPath) {
349
+ discoverEntitlements(artifactSearchDir, discovery, discovery.targetName);
350
+ }
351
+ return discovery;
352
+ }
353
+ const basePath = stat.isDirectory() ? inputPath : path.dirname(inputPath);
354
+ const discovery = {
355
+ projectPath: basePath,
356
+ isWorkspace: false,
357
+ };
358
+ // BUG FIX #3: Recursive search for xcworkspace and xcodeproj
359
+ const xcworkspaces = findFilesRecursive(basePath, (name) => name.endsWith('.xcworkspace'));
360
+ if (xcworkspaces.length > 0) {
361
+ discovery.isWorkspace = true;
362
+ // P1 FIX: If workspace found, try to parse it for project references
363
+ try {
364
+ const workspaceProjects = (0, workspace_parser_js_1.getWorkspaceProjects)(xcworkspaces[0]);
365
+ discovery.workspaceProjects = workspaceProjects;
366
+ if (workspaceProjects.length > 0) {
367
+ const mainProject = workspaceProjects[0];
368
+ const pbxprojPath = path.join(mainProject, 'project.pbxproj');
369
+ if (fs.existsSync(pbxprojPath)) {
370
+ discovery.pbxprojPath = pbxprojPath;
371
+ discovery.projectScopeDir = path.dirname(mainProject);
372
+ // P1 FIX: Set dependencyScopeDir for root-level workspace discovery
373
+ discovery.dependencyScopeDir = mainProject;
374
+ // P2 FIX: Get artifacts from pbxproj
375
+ const artifacts = parsePbxprojForArtifacts(pbxprojPath, path.dirname(mainProject));
376
+ if (artifacts.targetName) {
377
+ discovery.targetName = artifacts.targetName;
378
+ }
379
+ if (artifacts.infoPlistPath) {
380
+ discovery.infoPlistPath = artifacts.infoPlistPath;
381
+ }
382
+ if (artifacts.entitlementsPath) {
383
+ discovery.entitlementsPath = artifacts.entitlementsPath;
384
+ }
385
+ }
386
+ }
387
+ }
388
+ catch {
389
+ // Fall through to directory scan
390
+ }
391
+ }
392
+ // Fall back to directory scan for xcodeproj
393
+ if (!discovery.pbxprojPath) {
394
+ const xcodeprojs = findFilesRecursive(basePath, (name) => name.endsWith('.xcodeproj'));
395
+ // Filter out Pods
396
+ const mainXcodeprojs = xcodeprojs.filter(p => !p.includes('/Pods/') && !p.endsWith('Pods.xcodeproj'));
397
+ const projectList = mainXcodeprojs.length > 0 ? mainXcodeprojs : xcodeprojs;
398
+ for (const xcodeprojPath of projectList) {
399
+ const pbxprojPath = path.join(xcodeprojPath, 'project.pbxproj');
400
+ if (fs.existsSync(pbxprojPath)) {
401
+ discovery.pbxprojPath = pbxprojPath;
402
+ // P2 FIX: Scope artifact search to project's directory
403
+ discovery.projectScopeDir = path.dirname(xcodeprojPath);
404
+ // P1 FIX: Set dependencyScopeDir for root-level xcodeproj discovery
405
+ discovery.dependencyScopeDir = xcodeprojPath;
406
+ // P2 FIX: Try to get artifacts from pbxproj
407
+ const artifacts = parsePbxprojForArtifacts(pbxprojPath, path.dirname(xcodeprojPath));
408
+ if (artifacts.targetName) {
409
+ discovery.targetName = artifacts.targetName;
410
+ }
411
+ if (artifacts.infoPlistPath) {
412
+ discovery.infoPlistPath = artifacts.infoPlistPath;
413
+ }
414
+ if (artifacts.entitlementsPath) {
415
+ discovery.entitlementsPath = artifacts.entitlementsPath;
416
+ }
417
+ break;
418
+ }
419
+ }
420
+ }
421
+ // P2 FIX: Search for artifacts within the project scope to avoid monorepo mixing
422
+ // Pass targetName to scope the search and prevent monorepo bleeding
423
+ const artifactSearchDir = discovery.projectScopeDir || basePath;
424
+ if (!discovery.infoPlistPath) {
425
+ discoverInfoPlist(artifactSearchDir, discovery, discovery.targetName);
426
+ }
427
+ if (!discovery.entitlementsPath) {
428
+ discoverEntitlements(artifactSearchDir, discovery, discovery.targetName);
429
+ }
430
+ return discovery;
431
+ }
432
+ /**
433
+ * Discovers Info.plist in project directory (recursive)
434
+ * This is the fallback when pbxproj parsing doesn't yield a path
435
+ *
436
+ * P2 FIX: If targetName is provided, first try searching only in the target's subdirectory
437
+ * to avoid picking up Info.plist from sibling projects in monorepos
438
+ *
439
+ * P2-B FIX: Excludes directories containing a different .xcodeproj (sibling projects)
440
+ */
441
+ function discoverInfoPlist(basePath, discovery, targetName) {
442
+ // Get the current xcodeproj path for sibling exclusion
443
+ const currentXcodeprojPath = discovery.pbxprojPath ? path.dirname(discovery.pbxprojPath) : undefined;
444
+ const findOptions = { currentXcodeprojPath };
445
+ // P2 FIX: If we have a target name, first try the target-specific subdirectory
446
+ if (targetName) {
447
+ const targetDir = path.join(basePath, targetName);
448
+ if (fs.existsSync(targetDir) && fs.statSync(targetDir).isDirectory()) {
449
+ // Check target root first
450
+ const targetPlist = path.join(targetDir, 'Info.plist');
451
+ if (fs.existsSync(targetPlist)) {
452
+ discovery.infoPlistPath = targetPlist;
453
+ return;
454
+ }
455
+ // Recursive search within target directory only
456
+ const plists = findFilesRecursive(targetDir, (name) => name === 'Info.plist', findOptions);
457
+ if (plists.length > 0) {
458
+ plists.sort((a, b) => a.split(path.sep).length - b.split(path.sep).length);
459
+ discovery.infoPlistPath = plists[0];
460
+ return;
461
+ }
462
+ }
463
+ }
464
+ // P2-C FIX: Skip root-level check if basePath contains multiple .xcodeproj bundles (monorepo)
465
+ // This prevents picking up a sibling app's Info.plist that happens to be at root
466
+ const isMonorepoRoot = hasMultipleXcodeprojs(basePath);
467
+ if (!isMonorepoRoot) {
468
+ // First check root (only safe in single-project directories)
469
+ const rootPlist = path.join(basePath, 'Info.plist');
470
+ if (fs.existsSync(rootPlist)) {
471
+ discovery.infoPlistPath = rootPlist;
472
+ return;
473
+ }
474
+ }
475
+ // P2-B FIX: Recursive search with sibling project exclusion
476
+ let plists = findFilesRecursive(basePath, (name) => name === 'Info.plist', findOptions);
477
+ // P2-C FIX: If monorepo root, filter out root-level Info.plist from recursive results too
478
+ // (recursive search finds files in basePath directory as well)
479
+ if (isMonorepoRoot) {
480
+ const rootPlist = path.join(basePath, 'Info.plist');
481
+ plists = plists.filter(p => path.resolve(p) !== path.resolve(rootPlist));
482
+ }
483
+ if (plists.length > 0) {
484
+ // Prefer shorter paths (closer to root)
485
+ plists.sort((a, b) => a.split(path.sep).length - b.split(path.sep).length);
486
+ discovery.infoPlistPath = plists[0];
487
+ }
488
+ }
489
+ /**
490
+ * Discovers entitlements file in project directory (recursive)
491
+ * This is the fallback when pbxproj parsing doesn't yield a path
492
+ *
493
+ * P2 FIX: If targetName is provided, first try searching only in the target's subdirectory
494
+ * to avoid picking up entitlements from sibling projects in monorepos
495
+ *
496
+ * P2-B FIX: Excludes directories containing a different .xcodeproj (sibling projects)
497
+ *
498
+ * P2-C FIX: If basePath contains multiple .xcodeproj bundles (monorepo), filter out
499
+ * root-level entitlements files to prevent selecting sibling project entitlements
500
+ */
501
+ function discoverEntitlements(basePath, discovery, targetName) {
502
+ // Get the current xcodeproj path for sibling exclusion
503
+ const currentXcodeprojPath = discovery.pbxprojPath ? path.dirname(discovery.pbxprojPath) : undefined;
504
+ const findOptions = { currentXcodeprojPath };
505
+ // P2 FIX: If we have a target name, first try the target-specific subdirectory
506
+ if (targetName) {
507
+ const targetDir = path.join(basePath, targetName);
508
+ if (fs.existsSync(targetDir) && fs.statSync(targetDir).isDirectory()) {
509
+ const entitlements = findFilesRecursive(targetDir, (name) => name.endsWith('.entitlements'), findOptions);
510
+ if (entitlements.length > 0) {
511
+ entitlements.sort((a, b) => a.split(path.sep).length - b.split(path.sep).length);
512
+ discovery.entitlementsPath = entitlements[0];
513
+ return;
514
+ }
515
+ }
516
+ }
517
+ // P2-C FIX: Check if basePath has multiple xcodeprojs (monorepo indicator)
518
+ // This prevents picking up root-level entitlements from sibling projects
519
+ const isMonorepoRoot = hasMultipleXcodeprojs(basePath);
520
+ // P2-B FIX: Recursive search with sibling project exclusion
521
+ let entitlements = findFilesRecursive(basePath, (name) => name.endsWith('.entitlements'), findOptions);
522
+ // P2-C FIX: If monorepo root, filter out root-level entitlements files
523
+ // (recursive search finds files in basePath directory as well)
524
+ if (isMonorepoRoot && entitlements.length > 0) {
525
+ entitlements = entitlements.filter(p => path.dirname(path.resolve(p)) !== path.resolve(basePath));
526
+ }
527
+ if (entitlements.length > 0) {
528
+ // Prefer shorter paths (closer to root)
529
+ entitlements.sort((a, b) => a.split(path.sep).length - b.split(path.sep).length);
530
+ discovery.entitlementsPath = entitlements[0];
531
+ }
532
+ }
533
+ /**
534
+ * Creates a scan context from discovered project
535
+ */
536
+ function createScanContext(discovery) {
537
+ let infoPlist = {};
538
+ let entitlements = {};
539
+ let linkedFrameworks = new Set();
540
+ let dependencies = [];
541
+ // Parse Info.plist
542
+ if (discovery.infoPlistPath) {
543
+ try {
544
+ infoPlist = (0, plist_parser_js_1.parsePlist)(discovery.infoPlistPath);
545
+ }
546
+ catch (error) {
547
+ console.warn(`Warning: Could not parse Info.plist: ${error}`);
548
+ }
549
+ }
550
+ // Parse entitlements
551
+ if (discovery.entitlementsPath) {
552
+ try {
553
+ entitlements = (0, entitlements_parser_js_1.parseEntitlements)(discovery.entitlementsPath);
554
+ }
555
+ catch (error) {
556
+ console.warn(`Warning: Could not parse entitlements: ${error}`);
557
+ }
558
+ }
559
+ // Parse frameworks from pbxproj
560
+ if (discovery.pbxprojPath) {
561
+ try {
562
+ linkedFrameworks = (0, framework_detector_js_1.parseProjectFrameworks)(discovery.pbxprojPath);
563
+ }
564
+ catch (error) {
565
+ console.warn(`Warning: Could not parse project frameworks: ${error}`);
566
+ }
567
+ }
568
+ // Load dependencies (P2-A FIX: scope to dependencyScopeDir to prevent picking up sibling project lockfiles)
569
+ try {
570
+ dependencies = (0, framework_detector_js_1.loadAllDependencies)(discovery.dependencyScopeDir ?? discovery.projectScopeDir ?? discovery.projectPath);
571
+ }
572
+ catch (error) {
573
+ console.warn(`Warning: Could not load dependencies: ${error}`);
574
+ }
575
+ return createContextObject(discovery.projectPath, infoPlist, entitlements, linkedFrameworks, dependencies);
576
+ }
577
+ /**
578
+ * Creates a ScanContext object with helper methods
579
+ */
580
+ function createContextObject(projectPath, infoPlist, entitlements, linkedFrameworks, dependencies) {
581
+ return {
582
+ projectPath,
583
+ infoPlist,
584
+ entitlements,
585
+ linkedFrameworks,
586
+ dependencies,
587
+ plistString(key) {
588
+ const value = this.infoPlist[key];
589
+ return typeof value === 'string' ? value : undefined;
590
+ },
591
+ plistArray(key) {
592
+ const value = this.infoPlist[key];
593
+ return Array.isArray(value) ? value : undefined;
594
+ },
595
+ plistBool(key) {
596
+ const value = this.infoPlist[key];
597
+ return typeof value === 'boolean' ? value : undefined;
598
+ },
599
+ hasPlistKey(key) {
600
+ return key in this.infoPlist;
601
+ },
602
+ hasFramework(name) {
603
+ return this.linkedFrameworks.has(name);
604
+ },
605
+ hasEntitlement(key) {
606
+ return key in this.entitlements;
607
+ },
608
+ entitlementString(key) {
609
+ const value = this.entitlements[key];
610
+ return typeof value === 'string' ? value : undefined;
611
+ },
612
+ entitlementArray(key) {
613
+ const value = this.entitlements[key];
614
+ return Array.isArray(value) ? value : undefined;
615
+ },
616
+ };
617
+ }
618
+ //# sourceMappingURL=project-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-parser.js","sourceRoot":"","sources":["../../src/parsers/project-parser.ts"],"names":[],"mappings":"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"}