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,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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"}
|