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.
- package/dist/analyzer.d.ts +13 -0
- package/dist/analyzer.js +225 -0
- package/dist/analyzer.js.map +1 -0
- package/dist/analyzers/asc-iap.d.ts +26 -0
- package/dist/analyzers/asc-iap.js +266 -0
- package/dist/analyzers/asc-iap.js.map +1 -0
- package/dist/analyzers/asc-metadata.d.ts +25 -0
- package/dist/analyzers/asc-metadata.js +289 -0
- package/dist/analyzers/asc-metadata.js.map +1 -0
- package/dist/analyzers/asc-screenshots.d.ts +26 -0
- package/dist/analyzers/asc-screenshots.js +254 -0
- package/dist/analyzers/asc-screenshots.js.map +1 -0
- package/dist/analyzers/asc-version.d.ts +31 -0
- package/dist/analyzers/asc-version.js +315 -0
- package/dist/analyzers/asc-version.js.map +1 -0
- package/dist/analyzers/code-scanner.d.ts +34 -0
- package/dist/analyzers/code-scanner.js +384 -0
- package/dist/analyzers/code-scanner.js.map +1 -0
- package/dist/analyzers/deprecated-api.d.ts +16 -0
- package/dist/analyzers/deprecated-api.js +384 -0
- package/dist/analyzers/deprecated-api.js.map +1 -0
- package/dist/analyzers/entitlements.d.ts +14 -0
- package/dist/analyzers/entitlements.js +311 -0
- package/dist/analyzers/entitlements.js.map +1 -0
- package/{src/analyzers/index.ts → dist/analyzers/index.d.ts} +1 -0
- package/dist/analyzers/index.js +28 -0
- package/dist/analyzers/index.js.map +1 -0
- package/dist/analyzers/info-plist.d.ts +22 -0
- package/dist/analyzers/info-plist.js +372 -0
- package/dist/analyzers/info-plist.js.map +1 -0
- package/dist/analyzers/privacy.d.ts +30 -0
- package/dist/analyzers/privacy.js +346 -0
- package/dist/analyzers/privacy.js.map +1 -0
- package/dist/analyzers/private-api.d.ts +18 -0
- package/dist/analyzers/private-api.js +355 -0
- package/dist/analyzers/private-api.js.map +1 -0
- package/dist/analyzers/security.d.ts +17 -0
- package/dist/analyzers/security.js +326 -0
- package/dist/analyzers/security.js.map +1 -0
- package/dist/analyzers/ui-ux.d.ts +34 -0
- package/dist/analyzers/ui-ux.js +455 -0
- package/dist/analyzers/ui-ux.js.map +1 -0
- package/dist/asc/auth.d.ts +19 -0
- package/dist/asc/auth.js +202 -0
- package/dist/asc/auth.js.map +1 -0
- package/dist/asc/client.d.ts +23 -0
- package/dist/asc/client.js +199 -0
- package/dist/asc/client.js.map +1 -0
- package/dist/asc/endpoints/apps.d.ts +38 -0
- package/dist/asc/endpoints/apps.js +88 -0
- package/dist/asc/endpoints/apps.js.map +1 -0
- package/dist/asc/endpoints/iap.d.ts +43 -0
- package/dist/asc/endpoints/iap.js +137 -0
- package/dist/asc/endpoints/iap.js.map +1 -0
- package/dist/asc/endpoints/screenshots.d.ts +46 -0
- package/dist/asc/endpoints/screenshots.js +121 -0
- package/dist/asc/endpoints/screenshots.js.map +1 -0
- package/dist/asc/endpoints/versions.d.ts +53 -0
- package/dist/asc/endpoints/versions.js +133 -0
- package/dist/asc/endpoints/versions.js.map +1 -0
- package/dist/asc/errors.d.ts +55 -0
- package/dist/asc/errors.js +102 -0
- package/dist/asc/errors.js.map +1 -0
- package/dist/asc/index.d.ts +19 -0
- package/dist/asc/index.js +71 -0
- package/dist/asc/index.js.map +1 -0
- package/dist/asc/types.d.ts +282 -0
- package/dist/asc/types.js +6 -0
- package/dist/asc/types.js.map +1 -0
- package/dist/badge/generator.d.ts +3 -0
- package/{src/badge/generator.ts → dist/badge/generator.js} +26 -25
- package/dist/badge/generator.js.map +1 -0
- package/{src/badge/index.ts → dist/badge/index.d.ts} +1 -0
- package/dist/badge/index.js +6 -0
- package/dist/badge/index.js.map +1 -0
- package/dist/badge/types.d.ts +6 -0
- package/dist/badge/types.js +3 -0
- package/dist/badge/types.js.map +1 -0
- package/dist/cache/file-cache.d.ts +15 -0
- package/dist/cache/file-cache.js +66 -0
- package/dist/cache/file-cache.js.map +1 -0
- package/{src/cache/index.ts → dist/cache/index.d.ts} +1 -0
- package/dist/cache/index.js +6 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/types.d.ts +10 -0
- package/dist/cache/types.js +3 -0
- package/dist/cache/types.js.map +1 -0
- package/dist/cli/commands/help.d.ts +2 -0
- package/{src/cli/commands/help.ts → dist/cli/commands/help.js} +7 -4
- package/dist/cli/commands/help.js.map +1 -0
- package/dist/cli/commands/scan.d.ts +3 -0
- package/dist/cli/commands/scan.js +74 -0
- package/dist/cli/commands/scan.js.map +1 -0
- package/dist/cli/commands/version.d.ts +2 -0
- package/dist/cli/commands/version.js +49 -0
- package/dist/cli/commands/version.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +85 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/types.d.ts +17 -0
- package/dist/cli/types.js +3 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/git/diff.d.ts +2 -0
- package/dist/git/diff.js +57 -0
- package/dist/git/diff.js.map +1 -0
- package/{src/git/index.ts → dist/git/index.d.ts} +1 -0
- package/dist/git/index.js +6 -0
- package/dist/git/index.js.map +1 -0
- package/dist/git/types.d.ts +6 -0
- package/dist/git/types.js +3 -0
- package/dist/git/types.js.map +1 -0
- package/dist/guidelines/database.d.ts +12 -0
- package/dist/guidelines/database.js +309 -0
- package/dist/guidelines/database.js.map +1 -0
- package/{src/guidelines/index.ts → dist/guidelines/index.d.ts} +1 -0
- package/dist/guidelines/index.js +9 -0
- package/dist/guidelines/index.js.map +1 -0
- package/dist/guidelines/matcher.d.ts +12 -0
- package/dist/guidelines/matcher.js +71 -0
- package/dist/guidelines/matcher.js.map +1 -0
- package/dist/guidelines/types.d.ts +20 -0
- package/dist/guidelines/types.js +3 -0
- package/dist/guidelines/types.js.map +1 -0
- package/dist/history/comparator.d.ts +12 -0
- package/dist/history/comparator.js +142 -0
- package/dist/history/comparator.js.map +1 -0
- package/{src/history/index.ts → dist/history/index.d.ts} +1 -0
- package/dist/history/index.js +8 -0
- package/dist/history/index.js.map +1 -0
- package/dist/history/store.d.ts +18 -0
- package/dist/history/store.js +155 -0
- package/dist/history/store.js.map +1 -0
- package/dist/history/types.d.ts +41 -0
- package/dist/history/types.js +3 -0
- package/dist/history/types.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +0 -0
- package/dist/index.js.map +1 -0
- package/{src/parsers/index.ts → dist/parsers/index.d.ts} +1 -0
- package/dist/parsers/index.js +11 -0
- package/dist/parsers/index.js.map +1 -0
- package/dist/parsers/plist.d.ts +42 -0
- package/dist/parsers/plist.js +235 -0
- package/dist/parsers/plist.js.map +1 -0
- package/dist/parsers/xcodeproj.d.ts +6 -0
- package/dist/parsers/xcodeproj.js +251 -0
- package/dist/parsers/xcodeproj.js.map +1 -0
- package/{src/progress/index.ts → dist/progress/index.d.ts} +1 -0
- package/dist/progress/index.js +6 -0
- package/dist/progress/index.js.map +1 -0
- package/dist/progress/reporter.d.ts +14 -0
- package/dist/progress/reporter.js +63 -0
- package/dist/progress/reporter.js.map +1 -0
- package/dist/progress/types.d.ts +9 -0
- package/dist/progress/types.js +3 -0
- package/dist/progress/types.js.map +1 -0
- package/dist/reports/html.d.ts +8 -0
- package/dist/reports/html.js +290 -0
- package/dist/reports/html.js.map +1 -0
- package/dist/reports/index.d.ts +7 -0
- package/dist/reports/index.js +24 -0
- package/dist/reports/index.js.map +1 -0
- package/dist/reports/json.d.ts +5 -0
- package/dist/reports/json.js +52 -0
- package/dist/reports/json.js.map +1 -0
- package/dist/reports/markdown.d.ts +11 -0
- package/dist/reports/markdown.js +155 -0
- package/dist/reports/markdown.js.map +1 -0
- package/dist/reports/types.d.ts +23 -0
- package/dist/reports/types.js +3 -0
- package/dist/reports/types.js.map +1 -0
- package/dist/rules/engine.d.ts +11 -0
- package/dist/rules/engine.js +142 -0
- package/dist/rules/engine.js.map +1 -0
- package/{src/rules/index.ts → dist/rules/index.d.ts} +1 -0
- package/dist/rules/index.js +8 -0
- package/dist/rules/index.js.map +1 -0
- package/dist/rules/loader.d.ts +23 -0
- package/dist/rules/loader.js +111 -0
- package/dist/rules/loader.js.map +1 -0
- package/dist/rules/types.d.ts +23 -0
- package/dist/rules/types.js +3 -0
- package/dist/rules/types.js.map +1 -0
- package/dist/types/index.d.ts +220 -0
- package/dist/types/index.js +25 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +8 -3
- package/.claude/settings.local.json +0 -42
- package/.github/actions/ios-review/action.yml +0 -106
- package/.github/workflows/ci.yml +0 -103
- package/.github/workflows/publish.yml +0 -57
- package/CHANGELOG.md +0 -66
- package/CONTRIBUTING.md +0 -175
- package/bitrise/step.sh +0 -128
- package/bitrise/step.yml +0 -101
- package/docs/ANALYZERS.md +0 -237
- package/docs/API.md +0 -308
- package/docs/BADGES.md +0 -130
- package/docs/CI_CD.md +0 -283
- package/docs/CLI.md +0 -140
- package/docs/REPORTS.md +0 -212
- package/docs/ROADMAP.md +0 -267
- package/docs/RULES.md +0 -182
- package/docs/SECURITY.md +0 -89
- package/docs/TROUBLESHOOTING.md +0 -227
- package/docs/tutorials/ASC_SETUP.md +0 -188
- package/docs/tutorials/CI_INTEGRATION.md +0 -292
- package/docs/tutorials/CUSTOM_RULES.md +0 -291
- package/docs/tutorials/GETTING_STARTED.md +0 -226
- package/docs/video-scripts/01-introduction.md +0 -106
- package/docs/video-scripts/02-cli-usage.md +0 -120
- package/docs/video-scripts/03-ci-integration.md +0 -198
- package/eslint.config.js +0 -33
- package/examples/.ios-review-rules.json +0 -82
- package/examples/bitrise-workflow.yml +0 -129
- package/examples/fastlane-lane.rb +0 -71
- package/examples/github-action.yml +0 -147
- package/fastlane/Fastfile.example +0 -114
- package/fastlane/README.md +0 -99
- package/jest.config.js +0 -36
- package/scripts/benchmark.ts +0 -112
- package/scripts/debug-parser.ts +0 -37
- package/scripts/debug-pbxproj.ts +0 -36
- package/scripts/debug-specific.ts +0 -47
- package/scripts/test-analyze.ts +0 -67
- package/scripts/xcode-cloud-review.sh +0 -167
- package/src/analyzer.ts +0 -227
- package/src/analyzers/asc-iap.ts +0 -300
- package/src/analyzers/asc-metadata.ts +0 -326
- package/src/analyzers/asc-screenshots.ts +0 -310
- package/src/analyzers/asc-version.ts +0 -368
- package/src/analyzers/code-scanner.ts +0 -408
- package/src/analyzers/deprecated-api.ts +0 -390
- package/src/analyzers/entitlements.ts +0 -345
- package/src/analyzers/info-plist.ts +0 -409
- package/src/analyzers/privacy.ts +0 -376
- package/src/analyzers/private-api.ts +0 -377
- package/src/analyzers/security.ts +0 -327
- package/src/analyzers/ui-ux.ts +0 -509
- package/src/asc/auth.ts +0 -204
- package/src/asc/client.ts +0 -258
- package/src/asc/endpoints/apps.ts +0 -115
- package/src/asc/endpoints/iap.ts +0 -171
- package/src/asc/endpoints/screenshots.ts +0 -164
- package/src/asc/endpoints/versions.ts +0 -174
- package/src/asc/errors.ts +0 -109
- package/src/asc/index.ts +0 -108
- package/src/asc/types.ts +0 -369
- package/src/badge/types.ts +0 -5
- package/src/cache/file-cache.ts +0 -75
- package/src/cache/types.ts +0 -10
- package/src/cli/commands/scan.ts +0 -44
- package/src/cli/commands/version.ts +0 -12
- package/src/cli/index.ts +0 -92
- package/src/cli/types.ts +0 -17
- package/src/git/diff.ts +0 -21
- package/src/git/types.ts +0 -5
- package/src/guidelines/database.ts +0 -344
- package/src/guidelines/matcher.ts +0 -84
- package/src/guidelines/types.ts +0 -28
- package/src/history/comparator.ts +0 -114
- package/src/history/store.ts +0 -135
- package/src/history/types.ts +0 -40
- package/src/index.ts +0 -1113
- package/src/parsers/plist.ts +0 -253
- package/src/parsers/xcodeproj.ts +0 -265
- package/src/progress/reporter.ts +0 -65
- package/src/progress/types.ts +0 -9
- package/src/reports/html.ts +0 -322
- package/src/reports/index.ts +0 -20
- package/src/reports/json.ts +0 -92
- package/src/reports/markdown.ts +0 -187
- package/src/reports/types.ts +0 -26
- package/src/rules/engine.ts +0 -121
- package/src/rules/loader.ts +0 -83
- package/src/rules/types.ts +0 -25
- package/src/types/index.ts +0 -247
- package/tests/analyzer.test.ts +0 -142
- package/tests/analyzers/asc-iap.test.ts +0 -228
- package/tests/analyzers/asc-metadata.test.ts +0 -210
- package/tests/analyzers/asc-screenshots.test.ts +0 -135
- package/tests/analyzers/asc-version.test.ts +0 -259
- package/tests/analyzers/code-scanner.test.ts +0 -745
- package/tests/analyzers/deprecated-api.test.ts +0 -286
- package/tests/analyzers/entitlements.test.ts +0 -411
- package/tests/analyzers/info-plist.test.ts +0 -148
- package/tests/analyzers/privacy.test.ts +0 -623
- package/tests/analyzers/private-api.test.ts +0 -255
- package/tests/analyzers/security.test.ts +0 -300
- package/tests/analyzers/ui-ux.test.ts +0 -357
- package/tests/asc/auth.test.ts +0 -189
- package/tests/asc/client.test.ts +0 -207
- package/tests/asc/endpoints.test.ts +0 -1359
- package/tests/badge/generator.test.ts +0 -73
- package/tests/cache/file-cache.test.ts +0 -124
- package/tests/cli/cli-index.test.ts +0 -510
- package/tests/cli/commands.test.ts +0 -67
- package/tests/cli/scan.test.ts +0 -152
- package/tests/git/diff.test.ts +0 -69
- package/tests/guidelines/matcher.test.ts +0 -209
- package/tests/history/comparator.test.ts +0 -272
- package/tests/history/store.test.ts +0 -200
- package/tests/integration/cli.test.ts +0 -95
- package/tests/integration/e2e.test.ts +0 -130
- package/tests/parsers/plist.test.ts +0 -240
- package/tests/parsers/xcodeproj.test.ts +0 -289
- package/tests/progress/reporter.test.ts +0 -117
- package/tests/reports/html.test.ts +0 -176
- package/tests/reports/json.test.ts +0 -235
- package/tests/reports/markdown.test.ts +0 -196
- package/tests/rules/engine.test.ts +0 -229
- package/tests/rules/loader.test.ts +0 -187
- package/tests/setup.ts +0 -15
- package/tsconfig.json +0 -27
- 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
|
package/dist/analyzer.js
ADDED
|
@@ -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
|