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,166 @@
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.knownUsageDescriptionKeys = void 0;
40
+ exports.parsePlist = parsePlist;
41
+ exports.parsePlistString = parsePlistString;
42
+ exports.parseStructuredPlist = parseStructuredPlist;
43
+ exports.structurePlistData = structurePlistData;
44
+ exports.isPlaceholder = isPlaceholder;
45
+ /**
46
+ * Parser for Info.plist files
47
+ */
48
+ const fs = __importStar(require("fs"));
49
+ const plist_1 = __importDefault(require("plist"));
50
+ /**
51
+ * Parses an Info.plist file at the given path
52
+ */
53
+ function parsePlist(filePath) {
54
+ if (!fs.existsSync(filePath)) {
55
+ throw new Error(`Info.plist not found at: ${filePath}`);
56
+ }
57
+ const content = fs.readFileSync(filePath, 'utf-8');
58
+ try {
59
+ const parsed = plist_1.default.parse(content);
60
+ if (typeof parsed !== 'object' || parsed === null) {
61
+ throw new Error('Root is not a dictionary');
62
+ }
63
+ return parsed;
64
+ }
65
+ catch (error) {
66
+ throw new Error(`Invalid Info.plist format at ${filePath}: ${error}`);
67
+ }
68
+ }
69
+ /**
70
+ * Parses Info.plist from a string
71
+ */
72
+ function parsePlistString(content) {
73
+ try {
74
+ const parsed = plist_1.default.parse(content);
75
+ if (typeof parsed !== 'object' || parsed === null) {
76
+ throw new Error('Root is not a dictionary');
77
+ }
78
+ return parsed;
79
+ }
80
+ catch (error) {
81
+ throw new Error(`Invalid plist format: ${error}`);
82
+ }
83
+ }
84
+ /**
85
+ * Parses Info.plist and returns structured data
86
+ */
87
+ function parseStructuredPlist(filePath) {
88
+ const raw = parsePlist(filePath);
89
+ return structurePlistData(raw);
90
+ }
91
+ /**
92
+ * Converts raw plist dict to structured format
93
+ */
94
+ function structurePlistData(raw) {
95
+ const usageDescriptions = {};
96
+ for (const [key, value] of Object.entries(raw)) {
97
+ if (key.startsWith('NS') && key.endsWith('UsageDescription')) {
98
+ if (typeof value === 'string') {
99
+ usageDescriptions[key] = value;
100
+ }
101
+ }
102
+ }
103
+ return {
104
+ bundleIdentifier: raw['CFBundleIdentifier'],
105
+ displayName: raw['CFBundleDisplayName'] || raw['CFBundleName'],
106
+ bundleName: raw['CFBundleName'],
107
+ minimumOSVersion: raw['MinimumOSVersion'],
108
+ requiredDeviceCapabilities: raw['UIRequiredDeviceCapabilities'] || [],
109
+ backgroundModes: raw['UIBackgroundModes'] || [],
110
+ usageDescriptions,
111
+ raw,
112
+ };
113
+ }
114
+ /**
115
+ * Known usage description keys and their associated frameworks
116
+ */
117
+ exports.knownUsageDescriptionKeys = {
118
+ 'NSCameraUsageDescription': ['AVFoundation', 'UIImagePickerController'],
119
+ 'NSMicrophoneUsageDescription': ['AVFoundation', 'AVAudioSession'],
120
+ 'NSPhotoLibraryUsageDescription': ['PhotosUI', 'Photos', 'UIImagePickerController'],
121
+ 'NSPhotoLibraryAddUsageDescription': ['PhotosUI', 'Photos'],
122
+ 'NSLocationWhenInUseUsageDescription': ['CoreLocation'],
123
+ 'NSLocationAlwaysUsageDescription': ['CoreLocation'],
124
+ 'NSLocationAlwaysAndWhenInUseUsageDescription': ['CoreLocation'],
125
+ 'NSContactsUsageDescription': ['Contacts', 'ContactsUI'],
126
+ 'NSCalendarsUsageDescription': ['EventKit', 'EventKitUI'],
127
+ 'NSRemindersUsageDescription': ['EventKit'],
128
+ 'NSBluetoothAlwaysUsageDescription': ['CoreBluetooth'],
129
+ 'NSBluetoothPeripheralUsageDescription': ['CoreBluetooth'],
130
+ 'NSHealthShareUsageDescription': ['HealthKit'],
131
+ 'NSHealthUpdateUsageDescription': ['HealthKit'],
132
+ 'NSMotionUsageDescription': ['CoreMotion'],
133
+ 'NSSpeechRecognitionUsageDescription': ['Speech'],
134
+ 'NSFaceIDUsageDescription': ['LocalAuthentication'],
135
+ 'NSHomeKitUsageDescription': ['HomeKit'],
136
+ 'NSSiriUsageDescription': ['Intents'],
137
+ 'NSAppleMusicUsageDescription': ['MediaPlayer', 'StoreKit'],
138
+ 'NSUserTrackingUsageDescription': ['AppTrackingTransparency'],
139
+ };
140
+ /**
141
+ * Checks if a usage description appears to be a placeholder
142
+ */
143
+ function isPlaceholder(value) {
144
+ const lowercased = value.toLowerCase().trim();
145
+ // Empty or very short
146
+ if (lowercased.length < 10) {
147
+ return true;
148
+ }
149
+ // Common placeholder patterns
150
+ const placeholders = [
151
+ 'lorem ipsum',
152
+ 'todo',
153
+ 'fixme',
154
+ 'placeholder',
155
+ 'description here',
156
+ 'add description',
157
+ 'your app',
158
+ 'this app',
159
+ 'test',
160
+ 'testing',
161
+ 'xxx',
162
+ '...',
163
+ ];
164
+ return placeholders.some(p => lowercased.includes(p));
165
+ }
166
+ //# sourceMappingURL=plist-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plist-parser.js","sourceRoot":"","sources":["../../src/parsers/plist-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ import type { Dependency, ScanContext } from '../types/index.js';
2
+ /**
3
+ * Result of project discovery
4
+ */
5
+ export interface ProjectDiscovery {
6
+ projectPath: string;
7
+ /** P2 FIX: Scoped directory for artifacts (parent of .xcodeproj) to prevent monorepo mixing */
8
+ projectScopeDir?: string;
9
+ /** P2-A FIX: Scoped directory for dependency lockfile discovery (the .xcodeproj path itself) */
10
+ dependencyScopeDir?: string;
11
+ infoPlistPath?: string;
12
+ entitlementsPath?: string;
13
+ pbxprojPath?: string;
14
+ isWorkspace: boolean;
15
+ /** P1/P2: All projects found in workspace (when applicable) */
16
+ workspaceProjects?: string[];
17
+ /** P2 FIX: Target name from pbxproj parsing (for scoped fallback discovery) */
18
+ targetName?: string;
19
+ }
20
+ /**
21
+ * Artifact paths extracted from project.pbxproj
22
+ */
23
+ export interface PbxprojArtifacts {
24
+ infoPlistPath?: string;
25
+ entitlementsPath?: string;
26
+ /** The target name these artifacts came from */
27
+ targetName?: string;
28
+ }
29
+ /**
30
+ * P1/P2 FIX: Parse project.pbxproj to extract explicit artifact paths
31
+ *
32
+ * Now uses proper target graph parsing to:
33
+ * 1. Find all PBXNativeTarget entries
34
+ * 2. Select main app target by productType (not name heuristics)
35
+ * 3. Get build settings from the correct target's configuration
36
+ * 4. Handle Xcode path variables properly
37
+ *
38
+ * @param pbxprojPath Path to project.pbxproj file
39
+ * @param projectDir Directory containing the .xcodeproj
40
+ * @returns Resolved artifact paths
41
+ */
42
+ export declare function parsePbxprojForArtifacts(pbxprojPath: string, projectDir: string): PbxprojArtifacts;
43
+ /**
44
+ * Discovers project files in a directory
45
+ *
46
+ * P1/P2 Fix: Now uses workspace parsing and explicit artifact paths
47
+ */
48
+ export declare function discoverProject(inputPath: string): ProjectDiscovery;
49
+ /**
50
+ * Creates a scan context from discovered project
51
+ */
52
+ export declare function createScanContext(discovery: ProjectDiscovery): ScanContext;
53
+ /**
54
+ * Creates a ScanContext object with helper methods
55
+ */
56
+ export declare function createContextObject(projectPath: string, infoPlist: Record<string, unknown>, entitlements: Record<string, unknown>, linkedFrameworks: Set<string>, dependencies: Dependency[]): ScanContext;
57
+ //# sourceMappingURL=project-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-parser.d.ts","sourceRoot":"","sources":["../../src/parsers/project-parser.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEjE;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,+FAA+F;IAC/F,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gGAAgG;IAChG,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;IACrB,+DAA+D;IAC/D,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,+EAA+E;IAC/E,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gDAAgD;IAChD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAmHD;;;;;;;;;;;;GAYG;AACH,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,gBAAgB,CA+ClG;AAiCD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,gBAAgB,CAiOnE;AAmHD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,gBAAgB,GAAG,WAAW,CA+C1E;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACrC,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,EAC7B,YAAY,EAAE,UAAU,EAAE,GACzB,WAAW,CA6Cb"}