ios-app-review-plugin 1.0.0 → 1.0.2

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 (315) hide show
  1. package/dist/analyzer.d.ts +13 -0
  2. package/dist/analyzer.js +225 -0
  3. package/dist/analyzer.js.map +1 -0
  4. package/dist/analyzers/asc-iap.d.ts +26 -0
  5. package/dist/analyzers/asc-iap.js +266 -0
  6. package/dist/analyzers/asc-iap.js.map +1 -0
  7. package/dist/analyzers/asc-metadata.d.ts +25 -0
  8. package/dist/analyzers/asc-metadata.js +289 -0
  9. package/dist/analyzers/asc-metadata.js.map +1 -0
  10. package/dist/analyzers/asc-screenshots.d.ts +26 -0
  11. package/dist/analyzers/asc-screenshots.js +254 -0
  12. package/dist/analyzers/asc-screenshots.js.map +1 -0
  13. package/dist/analyzers/asc-version.d.ts +31 -0
  14. package/dist/analyzers/asc-version.js +315 -0
  15. package/dist/analyzers/asc-version.js.map +1 -0
  16. package/dist/analyzers/code-scanner.d.ts +34 -0
  17. package/dist/analyzers/code-scanner.js +384 -0
  18. package/dist/analyzers/code-scanner.js.map +1 -0
  19. package/dist/analyzers/deprecated-api.d.ts +16 -0
  20. package/dist/analyzers/deprecated-api.js +384 -0
  21. package/dist/analyzers/deprecated-api.js.map +1 -0
  22. package/dist/analyzers/entitlements.d.ts +14 -0
  23. package/dist/analyzers/entitlements.js +311 -0
  24. package/dist/analyzers/entitlements.js.map +1 -0
  25. package/{src/analyzers/index.ts → dist/analyzers/index.d.ts} +1 -0
  26. package/dist/analyzers/index.js +28 -0
  27. package/dist/analyzers/index.js.map +1 -0
  28. package/dist/analyzers/info-plist.d.ts +22 -0
  29. package/dist/analyzers/info-plist.js +372 -0
  30. package/dist/analyzers/info-plist.js.map +1 -0
  31. package/dist/analyzers/privacy.d.ts +30 -0
  32. package/dist/analyzers/privacy.js +346 -0
  33. package/dist/analyzers/privacy.js.map +1 -0
  34. package/dist/analyzers/private-api.d.ts +18 -0
  35. package/dist/analyzers/private-api.js +355 -0
  36. package/dist/analyzers/private-api.js.map +1 -0
  37. package/dist/analyzers/security.d.ts +17 -0
  38. package/dist/analyzers/security.js +326 -0
  39. package/dist/analyzers/security.js.map +1 -0
  40. package/dist/analyzers/ui-ux.d.ts +34 -0
  41. package/dist/analyzers/ui-ux.js +455 -0
  42. package/dist/analyzers/ui-ux.js.map +1 -0
  43. package/dist/asc/auth.d.ts +19 -0
  44. package/dist/asc/auth.js +202 -0
  45. package/dist/asc/auth.js.map +1 -0
  46. package/dist/asc/client.d.ts +23 -0
  47. package/dist/asc/client.js +199 -0
  48. package/dist/asc/client.js.map +1 -0
  49. package/dist/asc/endpoints/apps.d.ts +38 -0
  50. package/dist/asc/endpoints/apps.js +88 -0
  51. package/dist/asc/endpoints/apps.js.map +1 -0
  52. package/dist/asc/endpoints/iap.d.ts +43 -0
  53. package/dist/asc/endpoints/iap.js +137 -0
  54. package/dist/asc/endpoints/iap.js.map +1 -0
  55. package/dist/asc/endpoints/screenshots.d.ts +46 -0
  56. package/dist/asc/endpoints/screenshots.js +121 -0
  57. package/dist/asc/endpoints/screenshots.js.map +1 -0
  58. package/dist/asc/endpoints/versions.d.ts +53 -0
  59. package/dist/asc/endpoints/versions.js +133 -0
  60. package/dist/asc/endpoints/versions.js.map +1 -0
  61. package/dist/asc/errors.d.ts +55 -0
  62. package/dist/asc/errors.js +102 -0
  63. package/dist/asc/errors.js.map +1 -0
  64. package/dist/asc/index.d.ts +19 -0
  65. package/dist/asc/index.js +71 -0
  66. package/dist/asc/index.js.map +1 -0
  67. package/dist/asc/types.d.ts +282 -0
  68. package/dist/asc/types.js +6 -0
  69. package/dist/asc/types.js.map +1 -0
  70. package/dist/badge/generator.d.ts +3 -0
  71. package/{src/badge/generator.ts → dist/badge/generator.js} +26 -25
  72. package/dist/badge/generator.js.map +1 -0
  73. package/{src/badge/index.ts → dist/badge/index.d.ts} +1 -0
  74. package/dist/badge/index.js +6 -0
  75. package/dist/badge/index.js.map +1 -0
  76. package/dist/badge/types.d.ts +6 -0
  77. package/dist/badge/types.js +3 -0
  78. package/dist/badge/types.js.map +1 -0
  79. package/dist/cache/file-cache.d.ts +15 -0
  80. package/dist/cache/file-cache.js +66 -0
  81. package/dist/cache/file-cache.js.map +1 -0
  82. package/{src/cache/index.ts → dist/cache/index.d.ts} +1 -0
  83. package/dist/cache/index.js +6 -0
  84. package/dist/cache/index.js.map +1 -0
  85. package/dist/cache/types.d.ts +10 -0
  86. package/dist/cache/types.js +3 -0
  87. package/dist/cache/types.js.map +1 -0
  88. package/dist/cli/commands/help.d.ts +2 -0
  89. package/{src/cli/commands/help.ts → dist/cli/commands/help.js} +7 -4
  90. package/dist/cli/commands/help.js.map +1 -0
  91. package/dist/cli/commands/scan.d.ts +3 -0
  92. package/dist/cli/commands/scan.js +74 -0
  93. package/dist/cli/commands/scan.js.map +1 -0
  94. package/dist/cli/commands/version.d.ts +2 -0
  95. package/dist/cli/commands/version.js +49 -0
  96. package/dist/cli/commands/version.js.map +1 -0
  97. package/dist/cli/index.d.ts +2 -0
  98. package/dist/cli/index.js +85 -0
  99. package/dist/cli/index.js.map +1 -0
  100. package/dist/cli/types.d.ts +17 -0
  101. package/dist/cli/types.js +3 -0
  102. package/dist/cli/types.js.map +1 -0
  103. package/dist/git/diff.d.ts +2 -0
  104. package/dist/git/diff.js +57 -0
  105. package/dist/git/diff.js.map +1 -0
  106. package/{src/git/index.ts → dist/git/index.d.ts} +1 -0
  107. package/dist/git/index.js +6 -0
  108. package/dist/git/index.js.map +1 -0
  109. package/dist/git/types.d.ts +6 -0
  110. package/dist/git/types.js +3 -0
  111. package/dist/git/types.js.map +1 -0
  112. package/dist/guidelines/database.d.ts +12 -0
  113. package/dist/guidelines/database.js +309 -0
  114. package/dist/guidelines/database.js.map +1 -0
  115. package/{src/guidelines/index.ts → dist/guidelines/index.d.ts} +1 -0
  116. package/dist/guidelines/index.js +9 -0
  117. package/dist/guidelines/index.js.map +1 -0
  118. package/dist/guidelines/matcher.d.ts +12 -0
  119. package/dist/guidelines/matcher.js +71 -0
  120. package/dist/guidelines/matcher.js.map +1 -0
  121. package/dist/guidelines/types.d.ts +20 -0
  122. package/dist/guidelines/types.js +3 -0
  123. package/dist/guidelines/types.js.map +1 -0
  124. package/dist/history/comparator.d.ts +12 -0
  125. package/dist/history/comparator.js +142 -0
  126. package/dist/history/comparator.js.map +1 -0
  127. package/{src/history/index.ts → dist/history/index.d.ts} +1 -0
  128. package/dist/history/index.js +8 -0
  129. package/dist/history/index.js.map +1 -0
  130. package/dist/history/store.d.ts +18 -0
  131. package/dist/history/store.js +155 -0
  132. package/dist/history/store.js.map +1 -0
  133. package/dist/history/types.d.ts +41 -0
  134. package/dist/history/types.js +3 -0
  135. package/dist/history/types.js.map +1 -0
  136. package/dist/index.d.ts +3 -0
  137. package/dist/index.js +0 -0
  138. package/dist/index.js.map +1 -0
  139. package/{src/parsers/index.ts → dist/parsers/index.d.ts} +1 -0
  140. package/dist/parsers/index.js +11 -0
  141. package/dist/parsers/index.js.map +1 -0
  142. package/dist/parsers/plist.d.ts +42 -0
  143. package/dist/parsers/plist.js +235 -0
  144. package/dist/parsers/plist.js.map +1 -0
  145. package/dist/parsers/xcodeproj.d.ts +6 -0
  146. package/dist/parsers/xcodeproj.js +251 -0
  147. package/dist/parsers/xcodeproj.js.map +1 -0
  148. package/{src/progress/index.ts → dist/progress/index.d.ts} +1 -0
  149. package/dist/progress/index.js +6 -0
  150. package/dist/progress/index.js.map +1 -0
  151. package/dist/progress/reporter.d.ts +14 -0
  152. package/dist/progress/reporter.js +63 -0
  153. package/dist/progress/reporter.js.map +1 -0
  154. package/dist/progress/types.d.ts +9 -0
  155. package/dist/progress/types.js +3 -0
  156. package/dist/progress/types.js.map +1 -0
  157. package/dist/reports/html.d.ts +8 -0
  158. package/dist/reports/html.js +290 -0
  159. package/dist/reports/html.js.map +1 -0
  160. package/dist/reports/index.d.ts +7 -0
  161. package/dist/reports/index.js +24 -0
  162. package/dist/reports/index.js.map +1 -0
  163. package/dist/reports/json.d.ts +5 -0
  164. package/dist/reports/json.js +52 -0
  165. package/dist/reports/json.js.map +1 -0
  166. package/dist/reports/markdown.d.ts +11 -0
  167. package/dist/reports/markdown.js +155 -0
  168. package/dist/reports/markdown.js.map +1 -0
  169. package/dist/reports/types.d.ts +23 -0
  170. package/dist/reports/types.js +3 -0
  171. package/dist/reports/types.js.map +1 -0
  172. package/dist/rules/engine.d.ts +11 -0
  173. package/dist/rules/engine.js +142 -0
  174. package/dist/rules/engine.js.map +1 -0
  175. package/{src/rules/index.ts → dist/rules/index.d.ts} +1 -0
  176. package/dist/rules/index.js +8 -0
  177. package/dist/rules/index.js.map +1 -0
  178. package/dist/rules/loader.d.ts +23 -0
  179. package/dist/rules/loader.js +111 -0
  180. package/dist/rules/loader.js.map +1 -0
  181. package/dist/rules/types.d.ts +23 -0
  182. package/dist/rules/types.js +3 -0
  183. package/dist/rules/types.js.map +1 -0
  184. package/dist/types/index.d.ts +220 -0
  185. package/dist/types/index.js +25 -0
  186. package/dist/types/index.js.map +1 -0
  187. package/package.json +8 -3
  188. package/.claude/settings.local.json +0 -42
  189. package/.github/actions/ios-review/action.yml +0 -106
  190. package/.github/workflows/ci.yml +0 -103
  191. package/.github/workflows/publish.yml +0 -57
  192. package/CHANGELOG.md +0 -66
  193. package/CONTRIBUTING.md +0 -175
  194. package/bitrise/step.sh +0 -128
  195. package/bitrise/step.yml +0 -101
  196. package/docs/ANALYZERS.md +0 -237
  197. package/docs/API.md +0 -308
  198. package/docs/BADGES.md +0 -130
  199. package/docs/CI_CD.md +0 -283
  200. package/docs/CLI.md +0 -140
  201. package/docs/REPORTS.md +0 -212
  202. package/docs/ROADMAP.md +0 -267
  203. package/docs/RULES.md +0 -182
  204. package/docs/SECURITY.md +0 -89
  205. package/docs/TROUBLESHOOTING.md +0 -227
  206. package/docs/tutorials/ASC_SETUP.md +0 -188
  207. package/docs/tutorials/CI_INTEGRATION.md +0 -292
  208. package/docs/tutorials/CUSTOM_RULES.md +0 -291
  209. package/docs/tutorials/GETTING_STARTED.md +0 -226
  210. package/docs/video-scripts/01-introduction.md +0 -106
  211. package/docs/video-scripts/02-cli-usage.md +0 -120
  212. package/docs/video-scripts/03-ci-integration.md +0 -198
  213. package/eslint.config.js +0 -33
  214. package/examples/.ios-review-rules.json +0 -82
  215. package/examples/bitrise-workflow.yml +0 -129
  216. package/examples/fastlane-lane.rb +0 -71
  217. package/examples/github-action.yml +0 -147
  218. package/fastlane/Fastfile.example +0 -114
  219. package/fastlane/README.md +0 -99
  220. package/jest.config.js +0 -36
  221. package/scripts/benchmark.ts +0 -112
  222. package/scripts/debug-parser.ts +0 -37
  223. package/scripts/debug-pbxproj.ts +0 -36
  224. package/scripts/debug-specific.ts +0 -47
  225. package/scripts/test-analyze.ts +0 -67
  226. package/scripts/xcode-cloud-review.sh +0 -167
  227. package/src/analyzer.ts +0 -227
  228. package/src/analyzers/asc-iap.ts +0 -300
  229. package/src/analyzers/asc-metadata.ts +0 -326
  230. package/src/analyzers/asc-screenshots.ts +0 -310
  231. package/src/analyzers/asc-version.ts +0 -368
  232. package/src/analyzers/code-scanner.ts +0 -408
  233. package/src/analyzers/deprecated-api.ts +0 -390
  234. package/src/analyzers/entitlements.ts +0 -345
  235. package/src/analyzers/info-plist.ts +0 -409
  236. package/src/analyzers/privacy.ts +0 -376
  237. package/src/analyzers/private-api.ts +0 -377
  238. package/src/analyzers/security.ts +0 -327
  239. package/src/analyzers/ui-ux.ts +0 -509
  240. package/src/asc/auth.ts +0 -204
  241. package/src/asc/client.ts +0 -258
  242. package/src/asc/endpoints/apps.ts +0 -115
  243. package/src/asc/endpoints/iap.ts +0 -171
  244. package/src/asc/endpoints/screenshots.ts +0 -164
  245. package/src/asc/endpoints/versions.ts +0 -174
  246. package/src/asc/errors.ts +0 -109
  247. package/src/asc/index.ts +0 -108
  248. package/src/asc/types.ts +0 -369
  249. package/src/badge/types.ts +0 -5
  250. package/src/cache/file-cache.ts +0 -75
  251. package/src/cache/types.ts +0 -10
  252. package/src/cli/commands/scan.ts +0 -44
  253. package/src/cli/commands/version.ts +0 -12
  254. package/src/cli/index.ts +0 -92
  255. package/src/cli/types.ts +0 -17
  256. package/src/git/diff.ts +0 -21
  257. package/src/git/types.ts +0 -5
  258. package/src/guidelines/database.ts +0 -344
  259. package/src/guidelines/matcher.ts +0 -84
  260. package/src/guidelines/types.ts +0 -28
  261. package/src/history/comparator.ts +0 -114
  262. package/src/history/store.ts +0 -135
  263. package/src/history/types.ts +0 -40
  264. package/src/index.ts +0 -1113
  265. package/src/parsers/plist.ts +0 -253
  266. package/src/parsers/xcodeproj.ts +0 -265
  267. package/src/progress/reporter.ts +0 -65
  268. package/src/progress/types.ts +0 -9
  269. package/src/reports/html.ts +0 -322
  270. package/src/reports/index.ts +0 -20
  271. package/src/reports/json.ts +0 -92
  272. package/src/reports/markdown.ts +0 -187
  273. package/src/reports/types.ts +0 -26
  274. package/src/rules/engine.ts +0 -121
  275. package/src/rules/loader.ts +0 -83
  276. package/src/rules/types.ts +0 -25
  277. package/src/types/index.ts +0 -247
  278. package/tests/analyzer.test.ts +0 -142
  279. package/tests/analyzers/asc-iap.test.ts +0 -228
  280. package/tests/analyzers/asc-metadata.test.ts +0 -210
  281. package/tests/analyzers/asc-screenshots.test.ts +0 -135
  282. package/tests/analyzers/asc-version.test.ts +0 -259
  283. package/tests/analyzers/code-scanner.test.ts +0 -745
  284. package/tests/analyzers/deprecated-api.test.ts +0 -286
  285. package/tests/analyzers/entitlements.test.ts +0 -411
  286. package/tests/analyzers/info-plist.test.ts +0 -148
  287. package/tests/analyzers/privacy.test.ts +0 -623
  288. package/tests/analyzers/private-api.test.ts +0 -255
  289. package/tests/analyzers/security.test.ts +0 -300
  290. package/tests/analyzers/ui-ux.test.ts +0 -357
  291. package/tests/asc/auth.test.ts +0 -189
  292. package/tests/asc/client.test.ts +0 -207
  293. package/tests/asc/endpoints.test.ts +0 -1359
  294. package/tests/badge/generator.test.ts +0 -73
  295. package/tests/cache/file-cache.test.ts +0 -124
  296. package/tests/cli/cli-index.test.ts +0 -510
  297. package/tests/cli/commands.test.ts +0 -67
  298. package/tests/cli/scan.test.ts +0 -152
  299. package/tests/git/diff.test.ts +0 -69
  300. package/tests/guidelines/matcher.test.ts +0 -209
  301. package/tests/history/comparator.test.ts +0 -272
  302. package/tests/history/store.test.ts +0 -200
  303. package/tests/integration/cli.test.ts +0 -95
  304. package/tests/integration/e2e.test.ts +0 -130
  305. package/tests/parsers/plist.test.ts +0 -240
  306. package/tests/parsers/xcodeproj.test.ts +0 -289
  307. package/tests/progress/reporter.test.ts +0 -117
  308. package/tests/reports/html.test.ts +0 -176
  309. package/tests/reports/json.test.ts +0 -235
  310. package/tests/reports/markdown.test.ts +0 -196
  311. package/tests/rules/engine.test.ts +0 -229
  312. package/tests/rules/loader.test.ts +0 -187
  313. package/tests/setup.ts +0 -15
  314. package/tsconfig.json +0 -27
  315. package/tsconfig.test.json +0 -9
@@ -0,0 +1,13 @@
1
+ import type { EnrichedAnalysisReport } from './guidelines/index.js';
2
+ import type { ProgressCallback } from './progress/index.js';
3
+ import type { FileCache } from './cache/index.js';
4
+ import type { AnalyzeInput } from './types/index.js';
5
+ export interface RunAnalysisOptions {
6
+ onProgress?: ProgressCallback;
7
+ cache?: FileCache;
8
+ }
9
+ /**
10
+ * Run analysis on an iOS project
11
+ */
12
+ export declare function runAnalysis(input: AnalyzeInput, options?: RunAnalysisOptions): Promise<EnrichedAnalysisReport>;
13
+ //# sourceMappingURL=analyzer.d.ts.map
@@ -0,0 +1,225 @@
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.runAnalysis = runAnalysis;
37
+ const path = __importStar(require("path"));
38
+ const xcodeproj_js_1 = require("./parsers/xcodeproj.js");
39
+ const info_plist_js_1 = require("./analyzers/info-plist.js");
40
+ const privacy_js_1 = require("./analyzers/privacy.js");
41
+ const entitlements_js_1 = require("./analyzers/entitlements.js");
42
+ const code_scanner_js_1 = require("./analyzers/code-scanner.js");
43
+ const asc_metadata_js_1 = require("./analyzers/asc-metadata.js");
44
+ const asc_screenshots_js_1 = require("./analyzers/asc-screenshots.js");
45
+ const asc_version_js_1 = require("./analyzers/asc-version.js");
46
+ const asc_iap_js_1 = require("./analyzers/asc-iap.js");
47
+ const deprecated_api_js_1 = require("./analyzers/deprecated-api.js");
48
+ const private_api_js_1 = require("./analyzers/private-api.js");
49
+ const security_js_1 = require("./analyzers/security.js");
50
+ const ui_ux_js_1 = require("./analyzers/ui-ux.js");
51
+ const index_js_1 = require("./rules/index.js");
52
+ const index_js_2 = require("./guidelines/index.js");
53
+ const index_js_3 = require("./git/index.js");
54
+ const index_js_4 = require("./progress/index.js");
55
+ /**
56
+ * Available analyzers
57
+ */
58
+ const ANALYZERS = {
59
+ 'info-plist': () => new info_plist_js_1.InfoPlistAnalyzer(),
60
+ privacy: () => new privacy_js_1.PrivacyAnalyzer(),
61
+ entitlements: () => new entitlements_js_1.EntitlementsAnalyzer(),
62
+ code: () => new code_scanner_js_1.CodeScanner(),
63
+ 'deprecated-api': () => new deprecated_api_js_1.DeprecatedAPIAnalyzer(),
64
+ 'private-api': () => new private_api_js_1.PrivateAPIAnalyzer(),
65
+ security: () => new security_js_1.SecurityAnalyzer(),
66
+ 'ui-ux': () => new ui_ux_js_1.UIUXAnalyzer(),
67
+ };
68
+ /**
69
+ * ASC analyzers (optional, require credentials)
70
+ */
71
+ const ASC_ANALYZERS = {
72
+ 'asc-metadata': () => new asc_metadata_js_1.ASCMetadataAnalyzer(),
73
+ 'asc-screenshots': () => new asc_screenshots_js_1.ASCScreenshotAnalyzer(),
74
+ 'asc-version': () => new asc_version_js_1.ASCVersionAnalyzer(),
75
+ 'asc-iap': () => new asc_iap_js_1.ASCIAPAnalyzer(),
76
+ };
77
+ /**
78
+ * Run analysis on an iOS project
79
+ */
80
+ async function runAnalysis(input, options) {
81
+ const startTime = Date.now();
82
+ const projectPath = path.resolve(input.projectPath);
83
+ // Parse the Xcode project
84
+ const project = await (0, xcodeproj_js_1.parseXcodeProject)(projectPath);
85
+ // Determine which analyzers to run
86
+ let analyzerNames;
87
+ if (!input.analyzers || input.analyzers.includes('all')) {
88
+ analyzerNames = Object.keys(ANALYZERS);
89
+ if (input.includeASC) {
90
+ analyzerNames.push(...Object.keys(ASC_ANALYZERS));
91
+ }
92
+ }
93
+ else {
94
+ analyzerNames = input.analyzers.filter((a) => a !== 'all' && (a in ANALYZERS || a in ASC_ANALYZERS));
95
+ }
96
+ // Resolve changed files for incremental scanning
97
+ const basePath = path.dirname(projectPath);
98
+ let changedFiles;
99
+ if (input.changedSince) {
100
+ changedFiles = (0, index_js_3.getChangedFiles)(basePath, input.changedSince);
101
+ if (changedFiles.length === 0) {
102
+ changedFiles = undefined; // fall back to full scan
103
+ }
104
+ }
105
+ // Setup progress reporter
106
+ const progress = new index_js_4.ProgressReporter(options?.onProgress);
107
+ progress.scanStart(analyzerNames.length);
108
+ // Split into core and ASC analyzers
109
+ const coreNames = analyzerNames.filter((n) => n in ANALYZERS);
110
+ const ascNames = analyzerNames.filter((n) => n in ASC_ANALYZERS);
111
+ // Run core analyzers in parallel
112
+ const corePromises = coreNames.map(async (name) => {
113
+ const createAnalyzer = ANALYZERS[name];
114
+ if (!createAnalyzer)
115
+ return null;
116
+ progress.analyzerStart(name);
117
+ const analyzerStart = Date.now();
118
+ const analyzer = createAnalyzer();
119
+ const result = await analyzer.analyze(project, {
120
+ targetName: input.targetName,
121
+ basePath,
122
+ bundleId: input.bundleId,
123
+ changedFiles,
124
+ });
125
+ progress.analyzerComplete(name, Date.now() - analyzerStart);
126
+ return result;
127
+ });
128
+ const coreSettled = await Promise.allSettled(corePromises);
129
+ const results = [];
130
+ for (const settled of coreSettled) {
131
+ if (settled.status === 'fulfilled' && settled.value) {
132
+ results.push(settled.value);
133
+ }
134
+ }
135
+ // Run ASC analyzers in parallel
136
+ if (ascNames.length > 0) {
137
+ const ascPromises = ascNames.map(async (name) => {
138
+ const createAnalyzer = ASC_ANALYZERS[name];
139
+ if (!createAnalyzer)
140
+ return null;
141
+ progress.analyzerStart(name);
142
+ const analyzerStart = Date.now();
143
+ const analyzer = createAnalyzer();
144
+ const result = await analyzer.analyze(project, {
145
+ targetName: input.targetName,
146
+ basePath,
147
+ bundleId: input.bundleId,
148
+ changedFiles,
149
+ });
150
+ progress.analyzerComplete(name, Date.now() - analyzerStart);
151
+ return result;
152
+ });
153
+ const ascSettled = await Promise.allSettled(ascPromises);
154
+ for (const settled of ascSettled) {
155
+ if (settled.status === 'fulfilled' && settled.value) {
156
+ results.push(settled.value);
157
+ }
158
+ }
159
+ }
160
+ // Run custom rules if available
161
+ try {
162
+ const loader = new index_js_1.RuleLoader();
163
+ const loaded = input.customRulesPath
164
+ ? await loader.loadConfig(input.customRulesPath).then((config) => ({
165
+ config,
166
+ rules: loader.compileRules(config),
167
+ }))
168
+ : await loader.loadFromProject(basePath);
169
+ if (loaded) {
170
+ const engine = new index_js_1.CustomRuleEngine(loaded.config);
171
+ const customResult = await engine.scan(basePath, loaded.rules);
172
+ if (customResult.issues.length > 0) {
173
+ results.push(customResult);
174
+ }
175
+ }
176
+ }
177
+ catch {
178
+ // Custom rules are optional; silently skip on error
179
+ }
180
+ // Calculate summary
181
+ const totalDuration = Date.now() - startTime;
182
+ const summary = calculateSummary(results, totalDuration);
183
+ progress.scanComplete(totalDuration);
184
+ const report = {
185
+ projectPath,
186
+ timestamp: new Date().toISOString(),
187
+ results,
188
+ summary,
189
+ };
190
+ // Enrich with guideline cross-references and score
191
+ const matcher = new index_js_2.GuidelineMatcher();
192
+ return matcher.enrichReport(report);
193
+ }
194
+ /**
195
+ * Calculate summary statistics from analysis results
196
+ */
197
+ function calculateSummary(results, duration) {
198
+ let errors = 0;
199
+ let warnings = 0;
200
+ let info = 0;
201
+ for (const result of results) {
202
+ for (const issue of result.issues) {
203
+ switch (issue.severity) {
204
+ case 'error':
205
+ errors++;
206
+ break;
207
+ case 'warning':
208
+ warnings++;
209
+ break;
210
+ case 'info':
211
+ info++;
212
+ break;
213
+ }
214
+ }
215
+ }
216
+ return {
217
+ totalIssues: errors + warnings + info,
218
+ errors,
219
+ warnings,
220
+ info,
221
+ passed: errors === 0,
222
+ duration,
223
+ };
224
+ }
225
+ //# sourceMappingURL=analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyzer.js","sourceRoot":"","sources":["../src/analyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * App Store Connect In-App Purchase Analyzer
3
+ *
4
+ * Validates IAPs including review screenshots, localizations,
5
+ * price points, and review status.
6
+ */
7
+ import type { Analyzer, AnalysisResult, AnalyzerOptions, XcodeProject } from '../types/index.js';
8
+ export declare class ASCIAPAnalyzer implements Analyzer {
9
+ name: string;
10
+ description: string;
11
+ analyze(project: XcodeProject, options?: AnalyzerOptions): Promise<AnalysisResult>;
12
+ /**
13
+ * Validate IAPs by bundle ID
14
+ */
15
+ validateByBundleId(bundleId: string): Promise<AnalysisResult>;
16
+ /**
17
+ * Validate all IAPs for a bundle ID
18
+ */
19
+ private validateIAPsForBundleId;
20
+ /**
21
+ * Convert IAP validation result to issues
22
+ */
23
+ private convertValidationToIssues;
24
+ private getBundleIdFromProject;
25
+ }
26
+ //# sourceMappingURL=asc-iap.d.ts.map
@@ -0,0 +1,266 @@
1
+ "use strict";
2
+ /**
3
+ * App Store Connect In-App Purchase Analyzer
4
+ *
5
+ * Validates IAPs including review screenshots, localizations,
6
+ * price points, and review status.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.ASCIAPAnalyzer = void 0;
10
+ const index_js_1 = require("../asc/index.js");
11
+ class ASCIAPAnalyzer {
12
+ name = 'ASC IAP Analyzer';
13
+ description = 'Validates in-app purchases in App Store Connect';
14
+ async analyze(project, options) {
15
+ const startTime = Date.now();
16
+ const issues = [];
17
+ if (!(0, index_js_1.hasCredentials)()) {
18
+ issues.push({
19
+ id: 'asc-credentials-not-configured',
20
+ title: 'App Store Connect credentials not configured',
21
+ description: 'ASC credentials are not configured. Set environment variables to enable IAP validation.',
22
+ severity: 'info',
23
+ category: 'iap',
24
+ });
25
+ return {
26
+ analyzer: this.name,
27
+ passed: true,
28
+ issues,
29
+ duration: Date.now() - startTime,
30
+ };
31
+ }
32
+ const bundleId = options?.bundleId ?? this.getBundleIdFromProject(project);
33
+ if (!bundleId) {
34
+ issues.push({
35
+ id: 'asc-no-bundle-id',
36
+ title: 'No bundle ID found',
37
+ description: 'Could not determine bundle ID from project.',
38
+ severity: 'warning',
39
+ category: 'iap',
40
+ });
41
+ return {
42
+ analyzer: this.name,
43
+ passed: true,
44
+ issues,
45
+ duration: Date.now() - startTime,
46
+ };
47
+ }
48
+ try {
49
+ const iapIssues = await this.validateIAPsForBundleId(bundleId);
50
+ issues.push(...iapIssues);
51
+ }
52
+ catch (error) {
53
+ if ((0, index_js_1.isASCError)(error)) {
54
+ issues.push({
55
+ id: error.code,
56
+ title: error.name,
57
+ description: error.message,
58
+ severity: 'error',
59
+ category: 'iap',
60
+ });
61
+ }
62
+ else {
63
+ issues.push({
64
+ id: 'asc-api-error',
65
+ title: 'App Store Connect API Error',
66
+ description: error instanceof Error ? error.message : String(error),
67
+ severity: 'error',
68
+ category: 'iap',
69
+ });
70
+ }
71
+ }
72
+ return {
73
+ analyzer: this.name,
74
+ passed: issues.filter((i) => i.severity === 'error').length === 0,
75
+ issues,
76
+ duration: Date.now() - startTime,
77
+ };
78
+ }
79
+ /**
80
+ * Validate IAPs by bundle ID
81
+ */
82
+ async validateByBundleId(bundleId) {
83
+ const startTime = Date.now();
84
+ const issues = [];
85
+ if (!(0, index_js_1.hasCredentials)()) {
86
+ return {
87
+ analyzer: this.name,
88
+ passed: false,
89
+ issues: [
90
+ {
91
+ id: 'asc-credentials-not-configured',
92
+ title: 'App Store Connect credentials not configured',
93
+ description: 'Set ASC environment variables to enable validation.',
94
+ severity: 'error',
95
+ category: 'iap',
96
+ },
97
+ ],
98
+ duration: Date.now() - startTime,
99
+ };
100
+ }
101
+ try {
102
+ const iapIssues = await this.validateIAPsForBundleId(bundleId);
103
+ issues.push(...iapIssues);
104
+ }
105
+ catch (error) {
106
+ if ((0, index_js_1.isASCError)(error)) {
107
+ issues.push({
108
+ id: error.code,
109
+ title: error.name,
110
+ description: error.message,
111
+ severity: 'error',
112
+ category: 'iap',
113
+ });
114
+ }
115
+ else {
116
+ throw error;
117
+ }
118
+ }
119
+ return {
120
+ analyzer: this.name,
121
+ passed: issues.filter((i) => i.severity === 'error').length === 0,
122
+ issues,
123
+ duration: Date.now() - startTime,
124
+ };
125
+ }
126
+ /**
127
+ * Validate all IAPs for a bundle ID
128
+ */
129
+ async validateIAPsForBundleId(bundleId) {
130
+ const issues = [];
131
+ const app = await (0, index_js_1.getAppByBundleId)(bundleId);
132
+ const validations = await (0, index_js_1.validateAllIAPs)(app.id);
133
+ if (validations.length === 0) {
134
+ issues.push({
135
+ id: 'asc-no-iaps',
136
+ title: 'No in-app purchases configured',
137
+ description: 'No in-app purchases found for this app in App Store Connect.',
138
+ severity: 'info',
139
+ category: 'iap',
140
+ });
141
+ return issues;
142
+ }
143
+ // Check each IAP
144
+ for (const validation of validations) {
145
+ const iapIssues = this.convertValidationToIssues(validation);
146
+ issues.push(...iapIssues);
147
+ }
148
+ // Summary stats
149
+ const readyCount = validations.filter((v) => v.isReadyForSubmission).length;
150
+ const notReadyCount = validations.length - readyCount;
151
+ if (notReadyCount > 0) {
152
+ issues.push({
153
+ id: 'asc-iaps-not-ready',
154
+ title: 'Some IAPs not ready for submission',
155
+ description: `${notReadyCount} of ${validations.length} in-app purchases are not ready for submission.`,
156
+ severity: notReadyCount === validations.length ? 'error' : 'warning',
157
+ category: 'iap',
158
+ });
159
+ }
160
+ return issues;
161
+ }
162
+ /**
163
+ * Convert IAP validation result to issues
164
+ */
165
+ convertValidationToIssues(validation) {
166
+ const issues = [];
167
+ const iapName = validation.iap.attributes.name;
168
+ const productId = validation.iap.attributes.productId;
169
+ const state = validation.iap.attributes.state;
170
+ // Check state
171
+ const stateDescription = (0, index_js_1.getIAPStateDescription)(state);
172
+ if (state === 'MISSING_METADATA') {
173
+ issues.push({
174
+ id: 'asc-iap-missing-metadata',
175
+ title: `IAP missing metadata: ${iapName}`,
176
+ description: `In-app purchase "${productId}" is missing required metadata.`,
177
+ severity: 'error',
178
+ category: 'iap',
179
+ suggestion: 'Complete all required fields in App Store Connect.',
180
+ });
181
+ }
182
+ else if (state === 'DEVELOPER_ACTION_NEEDED') {
183
+ issues.push({
184
+ id: 'asc-iap-action-needed',
185
+ title: `IAP requires action: ${iapName}`,
186
+ description: `In-app purchase "${productId}" requires developer action. Current state: ${stateDescription}`,
187
+ severity: 'error',
188
+ category: 'iap',
189
+ suggestion: 'Review the IAP in App Store Connect and address any issues.',
190
+ });
191
+ }
192
+ else if (state === 'REJECTED') {
193
+ issues.push({
194
+ id: 'asc-iap-rejected',
195
+ title: `IAP rejected: ${iapName}`,
196
+ description: `In-app purchase "${productId}" has been rejected by App Store review.`,
197
+ severity: 'error',
198
+ category: 'iap',
199
+ suggestion: 'Review the rejection reason in App Store Connect and make required changes.',
200
+ });
201
+ }
202
+ // Check localizations
203
+ if (validation.localizations.length === 0) {
204
+ issues.push({
205
+ id: 'asc-iap-no-localizations',
206
+ title: `IAP has no localizations: ${iapName}`,
207
+ description: `In-app purchase "${productId}" has no localizations configured.`,
208
+ severity: 'error',
209
+ category: 'iap',
210
+ });
211
+ }
212
+ else {
213
+ // Check each localization
214
+ for (const loc of validation.localizations) {
215
+ if (!loc.attributes.name) {
216
+ issues.push({
217
+ id: 'asc-iap-missing-name',
218
+ title: `IAP missing name (${loc.attributes.locale})`,
219
+ description: `In-app purchase "${productId}" is missing display name for locale ${loc.attributes.locale}.`,
220
+ severity: 'error',
221
+ category: 'iap',
222
+ });
223
+ }
224
+ if (!loc.attributes.description) {
225
+ issues.push({
226
+ id: 'asc-iap-missing-description',
227
+ title: `IAP missing description (${loc.attributes.locale})`,
228
+ description: `In-app purchase "${productId}" is missing description for locale ${loc.attributes.locale}.`,
229
+ severity: 'error',
230
+ category: 'iap',
231
+ });
232
+ }
233
+ }
234
+ }
235
+ // Check review screenshot for consumable/non-consumable
236
+ const requiresScreenshot = ['CONSUMABLE', 'NON_CONSUMABLE'].includes(validation.iap.attributes.inAppPurchaseType);
237
+ if (requiresScreenshot && !validation.reviewScreenshot) {
238
+ issues.push({
239
+ id: 'asc-iap-missing-screenshot',
240
+ title: `IAP missing review screenshot: ${iapName}`,
241
+ description: `In-app purchase "${productId}" requires a review screenshot for App Store review.`,
242
+ severity: 'error',
243
+ category: 'iap',
244
+ guideline: 'Guideline 3.1.1 - In-App Purchase',
245
+ suggestion: 'Upload a screenshot showing the IAP in use within your app.',
246
+ });
247
+ }
248
+ else if (validation.reviewScreenshot?.attributes.assetDeliveryState?.state === 'FAILED') {
249
+ issues.push({
250
+ id: 'asc-iap-screenshot-failed',
251
+ title: `IAP review screenshot failed: ${iapName}`,
252
+ description: `Review screenshot for "${productId}" failed to process.`,
253
+ severity: 'error',
254
+ category: 'iap',
255
+ suggestion: 'Re-upload the review screenshot.',
256
+ });
257
+ }
258
+ return issues;
259
+ }
260
+ getBundleIdFromProject(project) {
261
+ const appTarget = project.targets.find((t) => t.type === 'application');
262
+ return appTarget?.bundleIdentifier;
263
+ }
264
+ }
265
+ exports.ASCIAPAnalyzer = ASCIAPAnalyzer;
266
+ //# sourceMappingURL=asc-iap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asc-iap.js","sourceRoot":"","sources":["../../src/analyzers/asc-iap.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * App Store Connect Metadata Analyzer
3
+ *
4
+ * Validates app metadata from ASC including app name, subtitle,
5
+ * description, keywords, URLs, and checks for placeholder text.
6
+ */
7
+ import type { Analyzer, AnalysisResult, AnalyzerOptions, XcodeProject } from '../types/index.js';
8
+ export declare class ASCMetadataAnalyzer implements Analyzer {
9
+ name: string;
10
+ description: string;
11
+ analyze(project: XcodeProject, options?: AnalyzerOptions): Promise<AnalysisResult>;
12
+ /**
13
+ * Validate a single localization
14
+ */
15
+ private validateLocalization;
16
+ /**
17
+ * Standalone metadata validation by bundle ID
18
+ */
19
+ validateByBundleId(bundleId: string): Promise<AnalysisResult>;
20
+ /**
21
+ * Get bundle ID from project targets
22
+ */
23
+ private getBundleIdFromProject;
24
+ }
25
+ //# sourceMappingURL=asc-metadata.d.ts.map