ios-app-review-plugin 1.0.1 → 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 (314) 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.map +1 -0
  138. package/{src/parsers/index.ts → dist/parsers/index.d.ts} +1 -0
  139. package/dist/parsers/index.js +11 -0
  140. package/dist/parsers/index.js.map +1 -0
  141. package/dist/parsers/plist.d.ts +42 -0
  142. package/dist/parsers/plist.js +235 -0
  143. package/dist/parsers/plist.js.map +1 -0
  144. package/dist/parsers/xcodeproj.d.ts +6 -0
  145. package/dist/parsers/xcodeproj.js +251 -0
  146. package/dist/parsers/xcodeproj.js.map +1 -0
  147. package/{src/progress/index.ts → dist/progress/index.d.ts} +1 -0
  148. package/dist/progress/index.js +6 -0
  149. package/dist/progress/index.js.map +1 -0
  150. package/dist/progress/reporter.d.ts +14 -0
  151. package/dist/progress/reporter.js +63 -0
  152. package/dist/progress/reporter.js.map +1 -0
  153. package/dist/progress/types.d.ts +9 -0
  154. package/dist/progress/types.js +3 -0
  155. package/dist/progress/types.js.map +1 -0
  156. package/dist/reports/html.d.ts +8 -0
  157. package/dist/reports/html.js +290 -0
  158. package/dist/reports/html.js.map +1 -0
  159. package/dist/reports/index.d.ts +7 -0
  160. package/dist/reports/index.js +24 -0
  161. package/dist/reports/index.js.map +1 -0
  162. package/dist/reports/json.d.ts +5 -0
  163. package/dist/reports/json.js +52 -0
  164. package/dist/reports/json.js.map +1 -0
  165. package/dist/reports/markdown.d.ts +11 -0
  166. package/dist/reports/markdown.js +155 -0
  167. package/dist/reports/markdown.js.map +1 -0
  168. package/dist/reports/types.d.ts +23 -0
  169. package/dist/reports/types.js +3 -0
  170. package/dist/reports/types.js.map +1 -0
  171. package/dist/rules/engine.d.ts +11 -0
  172. package/dist/rules/engine.js +142 -0
  173. package/dist/rules/engine.js.map +1 -0
  174. package/{src/rules/index.ts → dist/rules/index.d.ts} +1 -0
  175. package/dist/rules/index.js +8 -0
  176. package/dist/rules/index.js.map +1 -0
  177. package/dist/rules/loader.d.ts +23 -0
  178. package/dist/rules/loader.js +111 -0
  179. package/dist/rules/loader.js.map +1 -0
  180. package/dist/rules/types.d.ts +23 -0
  181. package/dist/rules/types.js +3 -0
  182. package/dist/rules/types.js.map +1 -0
  183. package/dist/types/index.d.ts +220 -0
  184. package/dist/types/index.js +25 -0
  185. package/dist/types/index.js.map +1 -0
  186. package/package.json +6 -1
  187. package/.claude/settings.local.json +0 -42
  188. package/.github/actions/ios-review/action.yml +0 -106
  189. package/.github/workflows/ci.yml +0 -103
  190. package/.github/workflows/publish.yml +0 -57
  191. package/CHANGELOG.md +0 -66
  192. package/CONTRIBUTING.md +0 -175
  193. package/bitrise/step.sh +0 -128
  194. package/bitrise/step.yml +0 -101
  195. package/docs/ANALYZERS.md +0 -237
  196. package/docs/API.md +0 -308
  197. package/docs/BADGES.md +0 -130
  198. package/docs/CI_CD.md +0 -283
  199. package/docs/CLI.md +0 -140
  200. package/docs/REPORTS.md +0 -212
  201. package/docs/ROADMAP.md +0 -267
  202. package/docs/RULES.md +0 -182
  203. package/docs/SECURITY.md +0 -89
  204. package/docs/TROUBLESHOOTING.md +0 -227
  205. package/docs/tutorials/ASC_SETUP.md +0 -188
  206. package/docs/tutorials/CI_INTEGRATION.md +0 -292
  207. package/docs/tutorials/CUSTOM_RULES.md +0 -291
  208. package/docs/tutorials/GETTING_STARTED.md +0 -226
  209. package/docs/video-scripts/01-introduction.md +0 -106
  210. package/docs/video-scripts/02-cli-usage.md +0 -120
  211. package/docs/video-scripts/03-ci-integration.md +0 -198
  212. package/eslint.config.js +0 -33
  213. package/examples/.ios-review-rules.json +0 -82
  214. package/examples/bitrise-workflow.yml +0 -129
  215. package/examples/fastlane-lane.rb +0 -71
  216. package/examples/github-action.yml +0 -147
  217. package/fastlane/Fastfile.example +0 -114
  218. package/fastlane/README.md +0 -99
  219. package/jest.config.js +0 -36
  220. package/scripts/benchmark.ts +0 -112
  221. package/scripts/debug-parser.ts +0 -37
  222. package/scripts/debug-pbxproj.ts +0 -36
  223. package/scripts/debug-specific.ts +0 -47
  224. package/scripts/test-analyze.ts +0 -67
  225. package/scripts/xcode-cloud-review.sh +0 -167
  226. package/src/analyzer.ts +0 -227
  227. package/src/analyzers/asc-iap.ts +0 -300
  228. package/src/analyzers/asc-metadata.ts +0 -326
  229. package/src/analyzers/asc-screenshots.ts +0 -310
  230. package/src/analyzers/asc-version.ts +0 -368
  231. package/src/analyzers/code-scanner.ts +0 -408
  232. package/src/analyzers/deprecated-api.ts +0 -390
  233. package/src/analyzers/entitlements.ts +0 -345
  234. package/src/analyzers/info-plist.ts +0 -409
  235. package/src/analyzers/privacy.ts +0 -376
  236. package/src/analyzers/private-api.ts +0 -377
  237. package/src/analyzers/security.ts +0 -327
  238. package/src/analyzers/ui-ux.ts +0 -509
  239. package/src/asc/auth.ts +0 -204
  240. package/src/asc/client.ts +0 -258
  241. package/src/asc/endpoints/apps.ts +0 -115
  242. package/src/asc/endpoints/iap.ts +0 -171
  243. package/src/asc/endpoints/screenshots.ts +0 -164
  244. package/src/asc/endpoints/versions.ts +0 -174
  245. package/src/asc/errors.ts +0 -109
  246. package/src/asc/index.ts +0 -108
  247. package/src/asc/types.ts +0 -369
  248. package/src/badge/types.ts +0 -5
  249. package/src/cache/file-cache.ts +0 -75
  250. package/src/cache/types.ts +0 -10
  251. package/src/cli/commands/scan.ts +0 -44
  252. package/src/cli/commands/version.ts +0 -12
  253. package/src/cli/index.ts +0 -92
  254. package/src/cli/types.ts +0 -17
  255. package/src/git/diff.ts +0 -21
  256. package/src/git/types.ts +0 -5
  257. package/src/guidelines/database.ts +0 -344
  258. package/src/guidelines/matcher.ts +0 -84
  259. package/src/guidelines/types.ts +0 -28
  260. package/src/history/comparator.ts +0 -114
  261. package/src/history/store.ts +0 -135
  262. package/src/history/types.ts +0 -40
  263. package/src/index.ts +0 -1113
  264. package/src/parsers/plist.ts +0 -253
  265. package/src/parsers/xcodeproj.ts +0 -265
  266. package/src/progress/reporter.ts +0 -65
  267. package/src/progress/types.ts +0 -9
  268. package/src/reports/html.ts +0 -322
  269. package/src/reports/index.ts +0 -20
  270. package/src/reports/json.ts +0 -92
  271. package/src/reports/markdown.ts +0 -187
  272. package/src/reports/types.ts +0 -26
  273. package/src/rules/engine.ts +0 -121
  274. package/src/rules/loader.ts +0 -83
  275. package/src/rules/types.ts +0 -25
  276. package/src/types/index.ts +0 -247
  277. package/tests/analyzer.test.ts +0 -142
  278. package/tests/analyzers/asc-iap.test.ts +0 -228
  279. package/tests/analyzers/asc-metadata.test.ts +0 -210
  280. package/tests/analyzers/asc-screenshots.test.ts +0 -135
  281. package/tests/analyzers/asc-version.test.ts +0 -259
  282. package/tests/analyzers/code-scanner.test.ts +0 -745
  283. package/tests/analyzers/deprecated-api.test.ts +0 -286
  284. package/tests/analyzers/entitlements.test.ts +0 -411
  285. package/tests/analyzers/info-plist.test.ts +0 -148
  286. package/tests/analyzers/privacy.test.ts +0 -623
  287. package/tests/analyzers/private-api.test.ts +0 -255
  288. package/tests/analyzers/security.test.ts +0 -300
  289. package/tests/analyzers/ui-ux.test.ts +0 -357
  290. package/tests/asc/auth.test.ts +0 -189
  291. package/tests/asc/client.test.ts +0 -207
  292. package/tests/asc/endpoints.test.ts +0 -1359
  293. package/tests/badge/generator.test.ts +0 -73
  294. package/tests/cache/file-cache.test.ts +0 -124
  295. package/tests/cli/cli-index.test.ts +0 -510
  296. package/tests/cli/commands.test.ts +0 -67
  297. package/tests/cli/scan.test.ts +0 -152
  298. package/tests/git/diff.test.ts +0 -69
  299. package/tests/guidelines/matcher.test.ts +0 -209
  300. package/tests/history/comparator.test.ts +0 -272
  301. package/tests/history/store.test.ts +0 -200
  302. package/tests/integration/cli.test.ts +0 -95
  303. package/tests/integration/e2e.test.ts +0 -130
  304. package/tests/parsers/plist.test.ts +0 -240
  305. package/tests/parsers/xcodeproj.test.ts +0 -289
  306. package/tests/progress/reporter.test.ts +0 -117
  307. package/tests/reports/html.test.ts +0 -176
  308. package/tests/reports/json.test.ts +0 -235
  309. package/tests/reports/markdown.test.ts +0 -196
  310. package/tests/rules/engine.test.ts +0 -229
  311. package/tests/rules/loader.test.ts +0 -187
  312. package/tests/setup.ts +0 -15
  313. package/tsconfig.json +0 -27
  314. 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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6DA,kCAmIC;AAhMD,2CAA6B;AAC7B,yDAA2D;AAC3D,6DAA8D;AAC9D,uDAAyD;AACzD,iEAAmE;AACnE,iEAA0D;AAC1D,iEAAkE;AAClE,uEAAuE;AACvE,+DAAgE;AAChE,uDAAwD;AACxD,qEAAsE;AACtE,+DAAgE;AAChE,yDAA2D;AAC3D,mDAAoD;AACpD,+CAAgE;AAChE,oDAAyD;AACzD,6CAAiD;AACjD,kDAAuD;AAYvD;;GAEG;AACH,MAAM,SAAS,GAAmC;IAChD,YAAY,EAAE,GAAG,EAAE,CAAC,IAAI,iCAAiB,EAAE;IAC3C,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,4BAAe,EAAE;IACpC,YAAY,EAAE,GAAG,EAAE,CAAC,IAAI,sCAAoB,EAAE;IAC9C,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,6BAAW,EAAE;IAC7B,gBAAgB,EAAE,GAAG,EAAE,CAAC,IAAI,yCAAqB,EAAE;IACnD,aAAa,EAAE,GAAG,EAAE,CAAC,IAAI,mCAAkB,EAAE;IAC7C,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,8BAAgB,EAAE;IACtC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,uBAAY,EAAE;CAClC,CAAC;AAEF;;GAEG;AACH,MAAM,aAAa,GAAmC;IACpD,cAAc,EAAE,GAAG,EAAE,CAAC,IAAI,qCAAmB,EAAE;IAC/C,iBAAiB,EAAE,GAAG,EAAE,CAAC,IAAI,0CAAqB,EAAE;IACpD,aAAa,EAAE,GAAG,EAAE,CAAC,IAAI,mCAAkB,EAAE;IAC7C,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,2BAAc,EAAE;CACtC,CAAC;AAOF;;GAEG;AACI,KAAK,UAAU,WAAW,CAC/B,KAAmB,EACnB,OAA4B;IAE5B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAEpD,0BAA0B;IAC1B,MAAM,OAAO,GAAG,MAAM,IAAA,gCAAiB,EAAC,WAAW,CAAC,CAAC;IAErD,mCAAmC;IACnC,IAAI,aAAuB,CAAC;IAE5B,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACxD,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACvC,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;YACrB,aAAa,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;SAAM,CAAC;QACN,aAAa,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,CACpC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,IAAI,SAAS,IAAI,CAAC,IAAI,aAAa,CAAC,CAC7D,CAAC;IACJ,CAAC;IAED,iDAAiD;IACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC3C,IAAI,YAAkC,CAAC;IACvC,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;QACvB,YAAY,GAAG,IAAA,0BAAe,EAAC,QAAQ,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;QAC7D,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,YAAY,GAAG,SAAS,CAAC,CAAC,yBAAyB;QACrD,CAAC;IACH,CAAC;IAED,0BAA0B;IAC1B,MAAM,QAAQ,GAAG,IAAI,2BAAgB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAC3D,QAAQ,CAAC,SAAS,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAEzC,oCAAoC;IACpC,MAAM,SAAS,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC;IAC9D,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC;IAEjE,iCAAiC;IACjC,MAAM,YAAY,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QAChD,MAAM,cAAc,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,cAAc;YAAE,OAAO,IAAI,CAAC;QACjC,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAC7B,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE;YAC7C,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,QAAQ;YACR,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,YAAY;SACb,CAAC,CAAC;QACH,QAAQ,CAAC,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,aAAa,CAAC,CAAC;QAC5D,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC,CAAC;IAEH,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAqB,EAAE,CAAC;IAErC,KAAK,MAAM,OAAO,IAAI,WAAW,EAAE,CAAC;QAClC,IAAI,OAAO,CAAC,MAAM,KAAK,WAAW,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YACpD,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,gCAAgC;IAChC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,WAAW,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;YAC9C,MAAM,cAAc,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;YAC3C,IAAI,CAAC,cAAc;gBAAE,OAAO,IAAI,CAAC;YACjC,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YAC7B,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACjC,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;YAClC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE;gBAC7C,UAAU,EAAE,KAAK,CAAC,UAAU;gBAC5B,QAAQ;gBACR,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,YAAY;aACb,CAAC,CAAC;YACH,QAAQ,CAAC,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,aAAa,CAAC,CAAC;YAC5D,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC,CAAC;QAEH,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QACzD,KAAK,MAAM,OAAO,IAAI,UAAU,EAAE,CAAC;YACjC,IAAI,OAAO,CAAC,MAAM,KAAK,WAAW,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;gBACpD,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;IACH,CAAC;IAED,gCAAgC;IAChC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,qBAAU,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,KAAK,CAAC,eAAe;YAClC,CAAC,CAAC,MAAM,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;gBAC/D,MAAM;gBACN,KAAK,EAAE,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC;aACnC,CAAC,CAAC;YACL,CAAC,CAAC,MAAM,MAAM,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QAE3C,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,MAAM,GAAG,IAAI,2BAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACnD,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;YAC/D,IAAI,YAAY,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACnC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,oDAAoD;IACtD,CAAC;IAED,oBAAoB;IACpB,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IAC7C,MAAM,OAAO,GAAG,gBAAgB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;IAEzD,QAAQ,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;IAErC,MAAM,MAAM,GAAmB;QAC7B,WAAW;QACX,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,OAAO;QACP,OAAO;KACR,CAAC;IAEF,mDAAmD;IACnD,MAAM,OAAO,GAAG,IAAI,2BAAgB,EAAE,CAAC;IACvC,OAAO,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;AACtC,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,OAAyB,EAAE,QAAgB;IACnE,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,IAAI,GAAG,CAAC,CAAC;IAEb,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClC,QAAQ,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACvB,KAAK,OAAO;oBACV,MAAM,EAAE,CAAC;oBACT,MAAM;gBACR,KAAK,SAAS;oBACZ,QAAQ,EAAE,CAAC;oBACX,MAAM;gBACR,KAAK,MAAM;oBACT,IAAI,EAAE,CAAC;oBACP,MAAM;YACV,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,WAAW,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI;QACrC,MAAM;QACN,QAAQ;QACR,IAAI;QACJ,MAAM,EAAE,MAAM,KAAK,CAAC;QACpB,QAAQ;KACT,CAAC;AACJ,CAAC"}
@@ -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