@gpc-cli/cli 0.9.49 → 0.9.51
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/dist/{apps-FKD3ZG5X.js → apps-4GP3FD7O.js} +6 -3
- package/dist/apps-4GP3FD7O.js.map +1 -0
- package/dist/bin.js +2 -2
- package/dist/chunk-A7VRCCNS.js +17 -0
- package/dist/chunk-A7VRCCNS.js.map +1 -0
- package/dist/{chunk-7A4IKNZ5.js → chunk-NUH2MUGV.js} +14 -14
- package/dist/{config-JOYJ7TQC.js → config-NTDZA5TN.js} +2 -2
- package/dist/docs-GMFN6V4K.js +111 -0
- package/dist/docs-GMFN6V4K.js.map +1 -0
- package/dist/{doctor-Q4WI432G.js → doctor-M4AHIANK.js} +2 -2
- package/dist/{feedback-3JAMSICL.js → feedback-2HDEXLKJ.js} +2 -2
- package/dist/index.js +1 -1
- package/dist/{listings-7SGQ4SRX.js → listings-LNX6MQYN.js} +15 -11
- package/dist/listings-LNX6MQYN.js.map +1 -0
- package/dist/{publish-JPTI4EBT.js → publish-2VOCSEH2.js} +17 -3
- package/dist/publish-2VOCSEH2.js.map +1 -0
- package/dist/{releases-OUJ65774.js → releases-LUAHKIMY.js} +26 -6
- package/dist/releases-LUAHKIMY.js.map +1 -0
- package/dist/{testers-LSMBXCA2.js → testers-7BZXOJLN.js} +8 -5
- package/dist/testers-7BZXOJLN.js.map +1 -0
- package/dist/{tracks-DO7C5OSE.js → tracks-I4QZNZ3M.js} +8 -5
- package/dist/tracks-I4QZNZ3M.js.map +1 -0
- package/dist/{update-QSRQBFDJ.js → update-3UMY3JDP.js} +2 -2
- package/dist/{version-V2OQLSVG.js → version-ECUA4EAH.js} +2 -2
- package/package.json +5 -5
- package/dist/apps-FKD3ZG5X.js.map +0 -1
- package/dist/docs-4D2SJ4LY.js +0 -46
- package/dist/docs-4D2SJ4LY.js.map +0 -1
- package/dist/listings-7SGQ4SRX.js.map +0 -1
- package/dist/publish-JPTI4EBT.js.map +0 -1
- package/dist/releases-OUJ65774.js.map +0 -1
- package/dist/testers-LSMBXCA2.js.map +0 -1
- package/dist/tracks-DO7C5OSE.js.map +0 -1
- /package/dist/{chunk-7A4IKNZ5.js.map → chunk-NUH2MUGV.js.map} +0 -0
- /package/dist/{config-JOYJ7TQC.js.map → config-NTDZA5TN.js.map} +0 -0
- /package/dist/{doctor-Q4WI432G.js.map → doctor-M4AHIANK.js.map} +0 -0
- /package/dist/{feedback-3JAMSICL.js.map → feedback-2HDEXLKJ.js.map} +0 -0
- /package/dist/{update-QSRQBFDJ.js.map → update-3UMY3JDP.js.map} +0 -0
- /package/dist/{version-V2OQLSVG.js.map → version-ECUA4EAH.js.map} +0 -0
package/README.md
CHANGED
|
@@ -3,14 +3,14 @@
|
|
|
3
3
|
<p align="center"><strong>Ship Android apps from your terminal.</strong></p>
|
|
4
4
|
|
|
5
5
|
<p align="center">
|
|
6
|
-
The complete CLI for Google Play —
|
|
6
|
+
The complete CLI for Google Play — 208 API endpoints, one tool.<br>
|
|
7
7
|
Releases, rollouts, metadata, vitals, reviews, subscriptions, reports, and more.
|
|
8
8
|
</p>
|
|
9
9
|
|
|
10
10
|
<p align="center">
|
|
11
11
|
<a href="https://www.npmjs.com/package/@gpc-cli/cli"><img src="https://img.shields.io/npm/v/@gpc-cli/cli?color=00D26A" alt="npm version"></a>
|
|
12
12
|
<a href="https://github.com/yasserstudio/gpc"><img src="https://img.shields.io/github/stars/yasserstudio/gpc" alt="GitHub Stars"></a>
|
|
13
|
-
<img src="https://img.shields.io/badge/Tests-
|
|
13
|
+
<img src="https://img.shields.io/badge/Tests-1860_passing-00D26A" alt="Tests">
|
|
14
14
|
<img src="https://img.shields.io/badge/License-MIT-yellow" alt="License">
|
|
15
15
|
</p>
|
|
16
16
|
|
|
@@ -82,7 +82,7 @@ Fastlane supply covers ~20 of 204 Google Play API endpoints. gradle-play-publish
|
|
|
82
82
|
|
|
83
83
|
## What You Get
|
|
84
84
|
|
|
85
|
-
|
|
85
|
+
208 API endpoints across these command groups:
|
|
86
86
|
|
|
87
87
|
| Group | What you can do |
|
|
88
88
|
| ----------------- | -------------------------------------------------------------------------------------- |
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
buildCommitOptions
|
|
4
|
+
} from "./chunk-A7VRCCNS.js";
|
|
2
5
|
import {
|
|
3
6
|
isDryRun,
|
|
4
7
|
printDryRun
|
|
@@ -34,7 +37,7 @@ function registerAppsCommands(program) {
|
|
|
34
37
|
const format = getOutputFormat(program, config);
|
|
35
38
|
console.log(formatOutput(info, format));
|
|
36
39
|
});
|
|
37
|
-
apps.command("update").description("Update app details").option("--email <email>", "Contact email").option("--phone <phone>", "Contact phone").option("--website <url>", "Contact website").option("--default-lang <lang>", "Default language").action(async (options) => {
|
|
40
|
+
apps.command("update").description("Update app details").option("--email <email>", "Contact email").option("--phone <phone>", "Contact phone").option("--website <url>", "Contact website").option("--default-lang <lang>", "Default language").option("--changes-not-sent-for-review", "Commit changes without sending for review").option("--error-if-in-review", "Fail if changes are already in review").action(async (options) => {
|
|
38
41
|
const config = await loadConfig();
|
|
39
42
|
const packageName = options["app"] || program.opts()["app"] || config.app;
|
|
40
43
|
if (!packageName) {
|
|
@@ -75,7 +78,7 @@ function registerAppsCommands(program) {
|
|
|
75
78
|
serviceAccountPath: config.auth?.serviceAccount
|
|
76
79
|
});
|
|
77
80
|
const client = createApiClient({ auth });
|
|
78
|
-
const result = await updateAppDetails(client, packageName, data);
|
|
81
|
+
const result = await updateAppDetails(client, packageName, data, buildCommitOptions(options));
|
|
79
82
|
console.log(formatOutput(result, format));
|
|
80
83
|
});
|
|
81
84
|
apps.command("list").description("List configured applications").option("--limit <n>", "Maximum results to return").option("--next-page <token>", "Pagination token for next page").action(async (_options) => {
|
|
@@ -98,4 +101,4 @@ function registerAppsCommands(program) {
|
|
|
98
101
|
export {
|
|
99
102
|
registerAppsCommands
|
|
100
103
|
};
|
|
101
|
-
//# sourceMappingURL=apps-
|
|
104
|
+
//# sourceMappingURL=apps-4GP3FD7O.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/apps.ts"],"sourcesContent":["import type { Command } from \"commander\";\nimport { loadConfig } from \"@gpc-cli/config\";\nimport { resolveAuth } from \"@gpc-cli/auth\";\nimport { createApiClient } from \"@gpc-cli/api\";\nimport { getAppInfo, updateAppDetails, GpcError } from \"@gpc-cli/core\";\nimport { formatOutput } from \"@gpc-cli/core\";\nimport { getOutputFormat } from \"../format.js\";\nimport { isDryRun, printDryRun } from \"../dry-run.js\";\nimport { buildCommitOptions } from \"../commit-options.js\";\n\nexport function registerAppsCommands(program: Command): void {\n const apps = program.command(\"apps\").description(\"Manage applications\");\n\n apps\n .command(\"info [package]\")\n .description(\"Show app details\")\n .action(async (packageArg?: string) => {\n const config = await loadConfig();\n const packageName = packageArg || config.app;\n\n if (!packageName) {\n throw new GpcError(\n \"No package name provided. Usage: gpc apps info <package>\",\n \"MISSING_PACKAGE\",\n 2,\n \"gpc config set app com.example.app\",\n );\n }\n\n const auth = await resolveAuth({\n serviceAccountPath: config.auth?.serviceAccount,\n });\n const client = createApiClient({ auth });\n const info = await getAppInfo(client, packageName);\n const format = getOutputFormat(program, config);\n console.log(formatOutput(info, format));\n });\n\n apps\n .command(\"update\")\n .description(\"Update app details\")\n .option(\"--email <email>\", \"Contact email\")\n .option(\"--phone <phone>\", \"Contact phone\")\n .option(\"--website <url>\", \"Contact website\")\n .option(\"--default-lang <lang>\", \"Default language\")\n .option(\"--changes-not-sent-for-review\", \"Commit changes without sending for review\")\n .option(\"--error-if-in-review\", \"Fail if changes are already in review\")\n .action(async (options) => {\n const config = await loadConfig();\n const packageName = options[\"app\"] || program.opts()[\"app\"] || config.app;\n\n if (!packageName) {\n throw new GpcError(\n \"No package name provided. Usage: gpc apps update --email user@example.com\",\n \"MISSING_PACKAGE\",\n 2,\n \"gpc config set app com.example.app\",\n );\n }\n\n const data: Record<string, string> = {};\n if (options[\"email\"]) data[\"contactEmail\"] = options[\"email\"];\n if (options[\"phone\"]) data[\"contactPhone\"] = options[\"phone\"];\n if (options[\"website\"]) data[\"contactWebsite\"] = options[\"website\"];\n if (options[\"defaultLang\"]) data[\"defaultLanguage\"] = options[\"defaultLang\"];\n\n if (Object.keys(data).length === 0) {\n throw new GpcError(\n \"Provide at least one field to update (--email, --phone, --website, --default-lang).\",\n \"MISSING_OPTION\",\n 2,\n );\n }\n\n const format = getOutputFormat(program, config);\n\n if (isDryRun(program)) {\n printDryRun(\n {\n command: \"apps update\",\n action: \"update app details for\",\n target: packageName,\n details: data,\n },\n format,\n formatOutput,\n );\n return;\n }\n\n const auth = await resolveAuth({\n serviceAccountPath: config.auth?.serviceAccount,\n });\n const client = createApiClient({ auth });\n const result = await updateAppDetails(client, packageName, data, buildCommitOptions(options));\n console.log(formatOutput(result, format));\n });\n\n apps\n .command(\"list\")\n .description(\"List configured applications\")\n .option(\"--limit <n>\", \"Maximum results to return\")\n .option(\"--next-page <token>\", \"Pagination token for next page\")\n .action(async (_options) => {\n const config = await loadConfig();\n const format = getOutputFormat(program, config);\n\n if (config.app) {\n const apps = [{ packageName: config.app, source: \"config\" }];\n console.log(formatOutput(apps, format));\n } else {\n console.log(\"No apps configured.\");\n console.log(\"\");\n console.log(\"Set a default app:\");\n console.log(\" gpc config set app com.example.myapp\");\n console.log(\"\");\n console.log(\"Or use the --app flag:\");\n console.log(\" gpc apps info --app com.example.myapp\");\n }\n });\n}\n"],"mappings":"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","names":["apps"]}
|
package/dist/bin.js
CHANGED
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
createProgram,
|
|
4
4
|
handleCliError,
|
|
5
5
|
loadPlugins
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-NUH2MUGV.js";
|
|
7
7
|
import {
|
|
8
8
|
checkForUpdate,
|
|
9
9
|
formatUpdateNotification
|
|
@@ -46,7 +46,7 @@ if (!_isJsonMode && !_isQuiet && !_isSetupCommand && !existsSync(getUserConfigPa
|
|
|
46
46
|
}
|
|
47
47
|
await setupNetworking();
|
|
48
48
|
initAudit(getConfigDir());
|
|
49
|
-
var currentVersion = "0.9.
|
|
49
|
+
var currentVersion = "0.9.51";
|
|
50
50
|
var isUpdateCommand = process.argv[2] === "update";
|
|
51
51
|
var updateCheckPromise = isUpdateCommand ? Promise.resolve(null) : checkForUpdate(currentVersion);
|
|
52
52
|
if (process.argv.includes("--ci")) {
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// src/commit-options.ts
|
|
4
|
+
function buildCommitOptions(opts) {
|
|
5
|
+
const notSent = !!opts.changesNotSentForReview;
|
|
6
|
+
const errorIfReview = !!opts.errorIfInReview;
|
|
7
|
+
if (!notSent && !errorIfReview) return void 0;
|
|
8
|
+
return {
|
|
9
|
+
...notSent && { changesNotSentForReview: true },
|
|
10
|
+
...errorIfReview && { changesInReviewBehavior: "ERROR_IF_IN_REVIEW" }
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export {
|
|
15
|
+
buildCommitOptions
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=chunk-A7VRCCNS.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commit-options.ts"],"sourcesContent":["import type { EditCommitOptions } from \"@gpc-cli/api\";\n\nexport function buildCommitOptions(opts: Record<string, unknown>): EditCommitOptions | undefined {\n const notSent = !!opts.changesNotSentForReview;\n const errorIfReview = !!opts.errorIfInReview;\n if (!notSent && !errorIfReview) return undefined;\n return {\n ...(notSent && { changesNotSentForReview: true }),\n ...(errorIfReview && { changesInReviewBehavior: \"ERROR_IF_IN_REVIEW\" as const }),\n };\n}\n"],"mappings":";;;AAEO,SAAS,mBAAmB,MAA8D;AAC/F,QAAM,UAAU,CAAC,CAAC,KAAK;AACvB,QAAM,gBAAgB,CAAC,CAAC,KAAK;AAC7B,MAAI,CAAC,WAAW,CAAC,cAAe,QAAO;AACvC,SAAO;AAAA,IACL,GAAI,WAAW,EAAE,yBAAyB,KAAK;AAAA,IAC/C,GAAI,iBAAiB,EAAE,yBAAyB,qBAA8B;AAAA,EAChF;AACF;","names":[]}
|
|
@@ -67,22 +67,22 @@ function registerPluginCommands(program, manager) {
|
|
|
67
67
|
import { Command } from "commander";
|
|
68
68
|
async function createProgram(pluginManager) {
|
|
69
69
|
const program = new Command();
|
|
70
|
-
program.name("gpc").description("GPC \u2014 Google Play Console CLI").version("0.9.
|
|
70
|
+
program.name("gpc").description("GPC \u2014 Google Play Console CLI").version("0.9.51", "-V, --version").option("-o, --output <format>", "Output format: table, json, yaml, markdown, junit").option("-v, --verbose", "Enable debug logging").option("-q, --quiet", "Suppress non-essential output").option("-a, --app <package>", "App package name").option("-p, --profile <name>", "Auth profile name").option("--no-color", "Disable colored output").option("--no-interactive", "Disable interactive prompts").option("-y, --yes", "Skip confirmation prompts").option("--dry-run", "Preview changes without executing").option("--notify [target]", "Send webhook notification on completion (slack, discord, custom)").option("--ci", "Force CI mode (JSON output, no prompts, strict exit codes)").option("-j, --json", "Shorthand for --output json").option("--apps <csv>", "Comma-separated package names for multi-app operations").showSuggestionAfterError(false);
|
|
71
71
|
const commandLoaders = {
|
|
72
72
|
auth: async () => {
|
|
73
73
|
(await import("./auth-BA4FE2PO.js")).registerAuthCommands(program);
|
|
74
74
|
},
|
|
75
75
|
config: async () => {
|
|
76
|
-
(await import("./config-
|
|
76
|
+
(await import("./config-NTDZA5TN.js")).registerConfigCommands(program);
|
|
77
77
|
},
|
|
78
78
|
doctor: async () => {
|
|
79
|
-
(await import("./doctor-
|
|
79
|
+
(await import("./doctor-M4AHIANK.js")).registerDoctorCommand(program);
|
|
80
80
|
},
|
|
81
81
|
update: async () => {
|
|
82
|
-
(await import("./update-
|
|
82
|
+
(await import("./update-3UMY3JDP.js")).registerUpdateCommand(program);
|
|
83
83
|
},
|
|
84
84
|
docs: async () => {
|
|
85
|
-
(await import("./docs-
|
|
85
|
+
(await import("./docs-GMFN6V4K.js")).registerDocsCommand(program);
|
|
86
86
|
},
|
|
87
87
|
changelog: async () => {
|
|
88
88
|
(await import("./changelog-QLDFG5TV.js")).registerChangelogCommand(program);
|
|
@@ -91,19 +91,19 @@ async function createProgram(pluginManager) {
|
|
|
91
91
|
(await import("./completion-BCHRJSAT.js")).registerCompletionCommand(program);
|
|
92
92
|
},
|
|
93
93
|
apps: async () => {
|
|
94
|
-
(await import("./apps-
|
|
94
|
+
(await import("./apps-4GP3FD7O.js")).registerAppsCommands(program);
|
|
95
95
|
},
|
|
96
96
|
releases: async () => {
|
|
97
|
-
(await import("./releases-
|
|
97
|
+
(await import("./releases-LUAHKIMY.js")).registerReleasesCommands(program);
|
|
98
98
|
},
|
|
99
99
|
tracks: async () => {
|
|
100
|
-
(await import("./tracks-
|
|
100
|
+
(await import("./tracks-I4QZNZ3M.js")).registerTracksCommands(program);
|
|
101
101
|
},
|
|
102
102
|
status: async () => {
|
|
103
103
|
(await import("./status-3HXBBXG6.js")).registerStatusCommand(program);
|
|
104
104
|
},
|
|
105
105
|
listings: async () => {
|
|
106
|
-
(await import("./listings-
|
|
106
|
+
(await import("./listings-LNX6MQYN.js")).registerListingsCommands(program);
|
|
107
107
|
},
|
|
108
108
|
reviews: async () => {
|
|
109
109
|
(await import("./reviews-YCBBM656.js")).registerReviewsCommands(program);
|
|
@@ -130,13 +130,13 @@ async function createProgram(pluginManager) {
|
|
|
130
130
|
(await import("./users-UKG7VIQH.js")).registerUsersCommands(program);
|
|
131
131
|
},
|
|
132
132
|
testers: async () => {
|
|
133
|
-
(await import("./testers-
|
|
133
|
+
(await import("./testers-7BZXOJLN.js")).registerTestersCommands(program);
|
|
134
134
|
},
|
|
135
135
|
validate: async () => {
|
|
136
136
|
(await import("./validate-QIYSA3N7.js")).registerValidateCommand(program);
|
|
137
137
|
},
|
|
138
138
|
publish: async () => {
|
|
139
|
-
(await import("./publish-
|
|
139
|
+
(await import("./publish-2VOCSEH2.js")).registerPublishCommand(program);
|
|
140
140
|
},
|
|
141
141
|
recovery: async () => {
|
|
142
142
|
(await import("./recovery-YE3Z7NIN.js")).registerRecoveryCommands(program);
|
|
@@ -183,13 +183,13 @@ async function createProgram(pluginManager) {
|
|
|
183
183
|
(await import("./verify-UUQNQMPG.js")).registerVerifyCommand(program);
|
|
184
184
|
},
|
|
185
185
|
version: async () => {
|
|
186
|
-
(await import("./version-
|
|
186
|
+
(await import("./version-ECUA4EAH.js")).registerVersionCommand(program);
|
|
187
187
|
},
|
|
188
188
|
cache: async () => {
|
|
189
189
|
(await import("./cache-XKPLZYEB.js")).registerCacheCommand(program);
|
|
190
190
|
},
|
|
191
191
|
feedback: async () => {
|
|
192
|
-
(await import("./feedback-
|
|
192
|
+
(await import("./feedback-2HDEXLKJ.js")).registerFeedbackCommand(program);
|
|
193
193
|
},
|
|
194
194
|
quickstart: async () => {
|
|
195
195
|
(await import("./quickstart-Z5Y3FYJU.js")).registerQuickstartCommand(program);
|
|
@@ -457,4 +457,4 @@ export {
|
|
|
457
457
|
createProgram,
|
|
458
458
|
handleCliError
|
|
459
459
|
};
|
|
460
|
-
//# sourceMappingURL=chunk-
|
|
460
|
+
//# sourceMappingURL=chunk-NUH2MUGV.js.map
|
|
@@ -78,7 +78,7 @@ Configuration file created: ${path}`);
|
|
|
78
78
|
});
|
|
79
79
|
console.log("\nVerifying setup...");
|
|
80
80
|
try {
|
|
81
|
-
const { registerDoctorCommand } = await import("./doctor-
|
|
81
|
+
const { registerDoctorCommand } = await import("./doctor-M4AHIANK.js");
|
|
82
82
|
const { Command } = await import("commander");
|
|
83
83
|
const doctorProgram = new Command();
|
|
84
84
|
doctorProgram.option("-o, --output <format>", "Output format").option("-j, --json", "JSON mode");
|
|
@@ -107,4 +107,4 @@ Configuration file created: ${path}`);
|
|
|
107
107
|
export {
|
|
108
108
|
registerConfigCommands
|
|
109
109
|
};
|
|
110
|
-
//# sourceMappingURL=config-
|
|
110
|
+
//# sourceMappingURL=config-NTDZA5TN.js.map
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// src/commands/docs.ts
|
|
4
|
+
import * as cp from "child_process";
|
|
5
|
+
var PAGE_MAP = {
|
|
6
|
+
// Guide
|
|
7
|
+
installation: "guide/installation",
|
|
8
|
+
"quick-start": "guide/quick-start",
|
|
9
|
+
authentication: "guide/authentication",
|
|
10
|
+
configuration: "guide/configuration",
|
|
11
|
+
"developer-verification": "guide/developer-verification",
|
|
12
|
+
faq: "guide/faq",
|
|
13
|
+
// Commands
|
|
14
|
+
anomalies: "commands/anomalies",
|
|
15
|
+
apps: "commands/apps",
|
|
16
|
+
auth: "commands/auth",
|
|
17
|
+
bundle: "commands/bundle",
|
|
18
|
+
changelog: "commands/changelog",
|
|
19
|
+
config: "commands/config",
|
|
20
|
+
"data-safety": "commands/data-safety",
|
|
21
|
+
"device-tiers": "commands/device-tiers",
|
|
22
|
+
diff: "commands/diff",
|
|
23
|
+
enterprise: "commands/enterprise",
|
|
24
|
+
"external-transactions": "commands/external-transactions",
|
|
25
|
+
games: "commands/games",
|
|
26
|
+
"generated-apks": "commands/generated-apks",
|
|
27
|
+
grants: "commands/grants",
|
|
28
|
+
iap: "commands/iap",
|
|
29
|
+
init: "commands/init",
|
|
30
|
+
"install-skills": "commands/install-skills",
|
|
31
|
+
"internal-sharing": "commands/internal-sharing",
|
|
32
|
+
listings: "commands/listings",
|
|
33
|
+
migrate: "commands/migrate",
|
|
34
|
+
"one-time-products": "commands/one-time-products",
|
|
35
|
+
plugins: "commands/plugins",
|
|
36
|
+
preflight: "commands/preflight",
|
|
37
|
+
pricing: "commands/pricing",
|
|
38
|
+
publish: "commands/publish",
|
|
39
|
+
"purchase-options": "commands/purchase-options",
|
|
40
|
+
purchases: "commands/purchases",
|
|
41
|
+
quota: "commands/quota",
|
|
42
|
+
recovery: "commands/recovery",
|
|
43
|
+
releases: "commands/releases",
|
|
44
|
+
reports: "commands/reports",
|
|
45
|
+
reviews: "commands/reviews",
|
|
46
|
+
rtdn: "commands/rtdn",
|
|
47
|
+
status: "commands/status",
|
|
48
|
+
subscriptions: "commands/subscriptions",
|
|
49
|
+
testers: "commands/testers",
|
|
50
|
+
tracks: "commands/tracks",
|
|
51
|
+
train: "commands/train",
|
|
52
|
+
users: "commands/users",
|
|
53
|
+
verify: "commands/verify",
|
|
54
|
+
utility: "commands/utility",
|
|
55
|
+
vitals: "commands/vitals",
|
|
56
|
+
// Advanced
|
|
57
|
+
architecture: "advanced/architecture",
|
|
58
|
+
conventions: "advanced/conventions",
|
|
59
|
+
"error-codes": "advanced/error-codes",
|
|
60
|
+
plugins: "advanced/plugins",
|
|
61
|
+
"sdk-usage": "advanced/sdk-usage",
|
|
62
|
+
security: "advanced/security",
|
|
63
|
+
skills: "advanced/skills",
|
|
64
|
+
troubleshooting: "advanced/troubleshooting",
|
|
65
|
+
// CI/CD
|
|
66
|
+
bitbucket: "ci-cd/bitbucket",
|
|
67
|
+
circleci: "ci-cd/circleci",
|
|
68
|
+
"github-actions": "ci-cd/github-actions",
|
|
69
|
+
"gitlab-ci": "ci-cd/gitlab-ci",
|
|
70
|
+
"vitals-gates": "ci-cd/vitals-gates",
|
|
71
|
+
// Reference
|
|
72
|
+
"api-coverage": "reference/api-coverage",
|
|
73
|
+
changelog: "reference/changelog",
|
|
74
|
+
deprecations: "reference/deprecations",
|
|
75
|
+
"environment-variables": "reference/environment-variables",
|
|
76
|
+
"exit-codes": "reference/exit-codes",
|
|
77
|
+
"json-contract": "reference/json-contract",
|
|
78
|
+
// Migration
|
|
79
|
+
"from-console-ui": "migration/from-console-ui",
|
|
80
|
+
"from-fastlane": "migration/from-fastlane",
|
|
81
|
+
// Alternatives
|
|
82
|
+
fastlane: "alternatives/fastlane"
|
|
83
|
+
};
|
|
84
|
+
var BASE = "https://yasserstudio.github.io/gpc/";
|
|
85
|
+
function registerDocsCommand(program) {
|
|
86
|
+
program.command("docs [topic]").description("Open documentation in browser").option("--list", "List available documentation topics").action((topic, opts) => {
|
|
87
|
+
if (opts?.list) {
|
|
88
|
+
console.log("Available topics:");
|
|
89
|
+
for (const key of Object.keys(PAGE_MAP)) console.log(` gpc docs ${key}`);
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
const path = topic ? PAGE_MAP[topic] : void 0;
|
|
93
|
+
if (topic && !path) {
|
|
94
|
+
const err = new Error(`Unknown topic "${topic}".`);
|
|
95
|
+
Object.assign(err, { code: "USAGE_ERROR", exitCode: 2, suggestion: "Run: gpc docs --list" });
|
|
96
|
+
throw err;
|
|
97
|
+
}
|
|
98
|
+
const url = path ? `${BASE}${path}` : BASE;
|
|
99
|
+
const platform = process.platform;
|
|
100
|
+
const cmd = platform === "darwin" ? "open" : platform === "win32" ? "start" : "xdg-open";
|
|
101
|
+
cp.execFile(cmd, [url], (error) => {
|
|
102
|
+
if (error) {
|
|
103
|
+
console.log(`Open in your browser: ${url}`);
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
export {
|
|
109
|
+
registerDocsCommand
|
|
110
|
+
};
|
|
111
|
+
//# sourceMappingURL=docs-GMFN6V4K.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/docs.ts"],"sourcesContent":["import type { Command } from \"commander\";\nimport * as cp from \"node:child_process\";\n\nconst PAGE_MAP: Record<string, string> = {\n // Guide\n installation: \"guide/installation\",\n \"quick-start\": \"guide/quick-start\",\n authentication: \"guide/authentication\",\n configuration: \"guide/configuration\",\n \"developer-verification\": \"guide/developer-verification\",\n faq: \"guide/faq\",\n\n // Commands\n anomalies: \"commands/anomalies\",\n apps: \"commands/apps\",\n auth: \"commands/auth\",\n bundle: \"commands/bundle\",\n changelog: \"commands/changelog\",\n config: \"commands/config\",\n \"data-safety\": \"commands/data-safety\",\n \"device-tiers\": \"commands/device-tiers\",\n diff: \"commands/diff\",\n enterprise: \"commands/enterprise\",\n \"external-transactions\": \"commands/external-transactions\",\n games: \"commands/games\",\n \"generated-apks\": \"commands/generated-apks\",\n grants: \"commands/grants\",\n iap: \"commands/iap\",\n init: \"commands/init\",\n \"install-skills\": \"commands/install-skills\",\n \"internal-sharing\": \"commands/internal-sharing\",\n listings: \"commands/listings\",\n migrate: \"commands/migrate\",\n \"one-time-products\": \"commands/one-time-products\",\n plugins: \"commands/plugins\",\n preflight: \"commands/preflight\",\n pricing: \"commands/pricing\",\n publish: \"commands/publish\",\n \"purchase-options\": \"commands/purchase-options\",\n purchases: \"commands/purchases\",\n quota: \"commands/quota\",\n recovery: \"commands/recovery\",\n releases: \"commands/releases\",\n reports: \"commands/reports\",\n reviews: \"commands/reviews\",\n rtdn: \"commands/rtdn\",\n status: \"commands/status\",\n subscriptions: \"commands/subscriptions\",\n testers: \"commands/testers\",\n tracks: \"commands/tracks\",\n train: \"commands/train\",\n users: \"commands/users\",\n verify: \"commands/verify\",\n utility: \"commands/utility\",\n vitals: \"commands/vitals\",\n\n // Advanced\n architecture: \"advanced/architecture\",\n conventions: \"advanced/conventions\",\n \"error-codes\": \"advanced/error-codes\",\n plugins: \"advanced/plugins\",\n \"sdk-usage\": \"advanced/sdk-usage\",\n security: \"advanced/security\",\n skills: \"advanced/skills\",\n troubleshooting: \"advanced/troubleshooting\",\n\n // CI/CD\n bitbucket: \"ci-cd/bitbucket\",\n circleci: \"ci-cd/circleci\",\n \"github-actions\": \"ci-cd/github-actions\",\n \"gitlab-ci\": \"ci-cd/gitlab-ci\",\n \"vitals-gates\": \"ci-cd/vitals-gates\",\n\n // Reference\n \"api-coverage\": \"reference/api-coverage\",\n changelog: \"reference/changelog\",\n deprecations: \"reference/deprecations\",\n \"environment-variables\": \"reference/environment-variables\",\n \"exit-codes\": \"reference/exit-codes\",\n \"json-contract\": \"reference/json-contract\",\n\n // Migration\n \"from-console-ui\": \"migration/from-console-ui\",\n \"from-fastlane\": \"migration/from-fastlane\",\n\n // Alternatives\n fastlane: \"alternatives/fastlane\",\n};\n\nconst BASE = \"https://yasserstudio.github.io/gpc/\";\n\nexport function registerDocsCommand(program: Command): void {\n program\n .command(\"docs [topic]\")\n .description(\"Open documentation in browser\")\n .option(\"--list\", \"List available documentation topics\")\n .action((topic?: string, opts?: { list?: boolean }) => {\n if (opts?.list) {\n console.log(\"Available topics:\");\n for (const key of Object.keys(PAGE_MAP)) console.log(` gpc docs ${key}`);\n return;\n }\n const path = topic ? PAGE_MAP[topic] : undefined;\n if (topic && !path) {\n const err = new Error(`Unknown topic \"${topic}\".`);\n Object.assign(err, { code: \"USAGE_ERROR\", exitCode: 2, suggestion: \"Run: gpc docs --list\" });\n throw err;\n }\n const url = path ? `${BASE}${path}` : BASE;\n const platform = process.platform;\n const cmd = platform === \"darwin\" ? \"open\" : platform === \"win32\" ? \"start\" : \"xdg-open\";\n cp.execFile(cmd, [url], (error) => {\n if (error) {\n console.log(`Open in your browser: ${url}`);\n }\n });\n });\n}\n"],"mappings":";;;AACA,YAAY,QAAQ;AAEpB,IAAM,WAAmC;AAAA;AAAA,EAEvC,cAAc;AAAA,EACd,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,0BAA0B;AAAA,EAC1B,KAAK;AAAA;AAAA,EAGL,WAAW;AAAA,EACX,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,yBAAyB;AAAA,EACzB,OAAO;AAAA,EACP,kBAAkB;AAAA,EAClB,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,MAAM;AAAA,EACN,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,UAAU;AAAA,EACV,SAAS;AAAA,EACT,qBAAqB;AAAA,EACrB,SAAS;AAAA,EACT,WAAW;AAAA,EACX,SAAS;AAAA,EACT,SAAS;AAAA,EACT,oBAAoB;AAAA,EACpB,WAAW;AAAA,EACX,OAAO;AAAA,EACP,UAAU;AAAA,EACV,UAAU;AAAA,EACV,SAAS;AAAA,EACT,SAAS;AAAA,EACT,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,eAAe;AAAA,EACf,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA;AAAA,EAGR,cAAc;AAAA,EACd,aAAa;AAAA,EACb,eAAe;AAAA,EACf,SAAS;AAAA,EACT,aAAa;AAAA,EACb,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,iBAAiB;AAAA;AAAA,EAGjB,WAAW;AAAA,EACX,UAAU;AAAA,EACV,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,gBAAgB;AAAA;AAAA,EAGhB,gBAAgB;AAAA,EAChB,WAAW;AAAA,EACX,cAAc;AAAA,EACd,yBAAyB;AAAA,EACzB,cAAc;AAAA,EACd,iBAAiB;AAAA;AAAA,EAGjB,mBAAmB;AAAA,EACnB,iBAAiB;AAAA;AAAA,EAGjB,UAAU;AACZ;AAEA,IAAM,OAAO;AAEN,SAAS,oBAAoB,SAAwB;AAC1D,UACG,QAAQ,cAAc,EACtB,YAAY,+BAA+B,EAC3C,OAAO,UAAU,qCAAqC,EACtD,OAAO,CAAC,OAAgB,SAA8B;AACrD,QAAI,MAAM,MAAM;AACd,cAAQ,IAAI,mBAAmB;AAC/B,iBAAW,OAAO,OAAO,KAAK,QAAQ,EAAG,SAAQ,IAAI,cAAc,GAAG,EAAE;AACxE;AAAA,IACF;AACA,UAAM,OAAO,QAAQ,SAAS,KAAK,IAAI;AACvC,QAAI,SAAS,CAAC,MAAM;AAClB,YAAM,MAAM,IAAI,MAAM,kBAAkB,KAAK,IAAI;AACjD,aAAO,OAAO,KAAK,EAAE,MAAM,eAAe,UAAU,GAAG,YAAY,uBAAuB,CAAC;AAC3F,YAAM;AAAA,IACR;AACA,UAAM,MAAM,OAAO,GAAG,IAAI,GAAG,IAAI,KAAK;AACtC,UAAM,WAAW,QAAQ;AACzB,UAAM,MAAM,aAAa,WAAW,SAAS,aAAa,UAAU,UAAU;AAC9E,IAAG,YAAS,KAAK,CAAC,GAAG,GAAG,CAAC,UAAU;AACjC,UAAI,OAAO;AACT,gBAAQ,IAAI,yBAAyB,GAAG,EAAE;AAAA,MAC5C;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACL;","names":[]}
|
|
@@ -141,7 +141,7 @@ function checkCiEnvironment() {
|
|
|
141
141
|
};
|
|
142
142
|
}
|
|
143
143
|
async function checkGpcVersion() {
|
|
144
|
-
const currentVersion = "0.9.
|
|
144
|
+
const currentVersion = "0.9.51";
|
|
145
145
|
if (currentVersion === "0.0.0") {
|
|
146
146
|
return { name: "version", status: "info", message: "GPC development build" };
|
|
147
147
|
}
|
|
@@ -740,4 +740,4 @@ export {
|
|
|
740
740
|
checkVerificationDeadline,
|
|
741
741
|
registerDoctorCommand
|
|
742
742
|
};
|
|
743
|
-
//# sourceMappingURL=doctor-
|
|
743
|
+
//# sourceMappingURL=doctor-M4AHIANK.js.map
|
|
@@ -9,7 +9,7 @@ import { execFile } from "child_process";
|
|
|
9
9
|
import { listAuditEvents } from "@gpc-cli/core";
|
|
10
10
|
function registerFeedbackCommand(program) {
|
|
11
11
|
program.command("feedback").description("Open a pre-filled GitHub issue with system diagnostics").option("--title <title>", "Issue title").option("--print", "Print the report to stdout instead of opening a browser").action(async (opts) => {
|
|
12
|
-
const version = "0.9.
|
|
12
|
+
const version = "0.9.51";
|
|
13
13
|
let lastCommand = "";
|
|
14
14
|
try {
|
|
15
15
|
const events = await listAuditEvents({ limit: 3 });
|
|
@@ -67,4 +67,4 @@ ${url}`);
|
|
|
67
67
|
export {
|
|
68
68
|
registerFeedbackCommand
|
|
69
69
|
};
|
|
70
|
-
//# sourceMappingURL=feedback-
|
|
70
|
+
//# sourceMappingURL=feedback-2HDEXLKJ.js.map
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
buildCommitOptions
|
|
4
|
+
} from "./chunk-A7VRCCNS.js";
|
|
2
5
|
import {
|
|
3
6
|
getClient,
|
|
4
7
|
resolvePackageName
|
|
@@ -71,7 +74,7 @@ function registerListingsCommands(program) {
|
|
|
71
74
|
const result = await getListings(client, packageName, options.lang);
|
|
72
75
|
console.log(formatOutput(result, format));
|
|
73
76
|
});
|
|
74
|
-
listings.command("update").description("Update a store listing").option("--lang <language>", "Language code (BCP 47)").option("--title <text>", "App title").option("--short <text>", "Short description").option("--full <text>", "Full description").option("--full-file <path>", "Read full description from file").option("--video <url>", "Video URL").action(async (options) => {
|
|
77
|
+
listings.command("update").description("Update a store listing").option("--lang <language>", "Language code (BCP 47)").option("--title <text>", "App title").option("--short <text>", "Short description").option("--full <text>", "Full description").option("--full-file <path>", "Read full description from file").option("--video <url>", "Video URL").option("--changes-not-sent-for-review", "Commit changes without sending for review").option("--error-if-in-review", "Fail if changes are already in review").action(async (options) => {
|
|
75
78
|
const config = await loadConfig();
|
|
76
79
|
const packageName = resolvePackageName(program.opts()["app"], config);
|
|
77
80
|
const interactive = isInteractive(program);
|
|
@@ -116,10 +119,10 @@ function registerListingsCommands(program) {
|
|
|
116
119
|
return;
|
|
117
120
|
}
|
|
118
121
|
const client = await getClient(config);
|
|
119
|
-
const result = await updateListing(client, packageName, options.lang, data);
|
|
122
|
+
const result = await updateListing(client, packageName, options.lang, data, buildCommitOptions(options));
|
|
120
123
|
console.log(formatOutput(result, format));
|
|
121
124
|
});
|
|
122
|
-
listings.command("delete").description("Delete a store listing for a language").option("--lang <language>", "Language code (BCP 47)").action(async (options) => {
|
|
125
|
+
listings.command("delete").description("Delete a store listing for a language").option("--lang <language>", "Language code (BCP 47)").option("--changes-not-sent-for-review", "Commit changes without sending for review").option("--error-if-in-review", "Fail if changes are already in review").action(async (options) => {
|
|
123
126
|
const config = await loadConfig();
|
|
124
127
|
const packageName = resolvePackageName(program.opts()["app"], config);
|
|
125
128
|
const interactive = isInteractive(program);
|
|
@@ -146,7 +149,7 @@ function registerListingsCommands(program) {
|
|
|
146
149
|
return;
|
|
147
150
|
}
|
|
148
151
|
const client = await getClient(config);
|
|
149
|
-
await deleteListing(client, packageName, options.lang);
|
|
152
|
+
await deleteListing(client, packageName, options.lang, buildCommitOptions(options));
|
|
150
153
|
console.log(`Listing for "${options.lang}" deleted.`);
|
|
151
154
|
});
|
|
152
155
|
listings.command("pull").description("Download listings to Fastlane-format directory").option("--dir <path>", "Target directory (default: metadata)", "metadata").action(async (options) => {
|
|
@@ -166,7 +169,7 @@ function registerListingsCommands(program) {
|
|
|
166
169
|
)
|
|
167
170
|
);
|
|
168
171
|
});
|
|
169
|
-
listings.command("push").description("Upload listings from Fastlane-format directory").option("--dir <path>", "Source directory (default: metadata)", "metadata").option("--force", "Push even if fields exceed character limits").action(async (options) => {
|
|
172
|
+
listings.command("push").description("Upload listings from Fastlane-format directory").option("--dir <path>", "Source directory (default: metadata)", "metadata").option("--force", "Push even if fields exceed character limits").option("--changes-not-sent-for-review", "Commit changes without sending for review").option("--error-if-in-review", "Fail if changes are already in review").action(async (options) => {
|
|
170
173
|
const config = await loadConfig();
|
|
171
174
|
const packageName = resolvePackageName(program.opts()["app"], config);
|
|
172
175
|
const client = await getClient(config);
|
|
@@ -177,7 +180,8 @@ function registerListingsCommands(program) {
|
|
|
177
180
|
const dryRun = isDryRun(program);
|
|
178
181
|
const result = await pushListings(client, packageName, options.dir, {
|
|
179
182
|
dryRun,
|
|
180
|
-
force: options.force
|
|
183
|
+
force: options.force,
|
|
184
|
+
commitOptions: buildCommitOptions(options)
|
|
181
185
|
});
|
|
182
186
|
spinner.stop(dryRun ? "Dry-run complete (no changes made)" : "Listings pushed");
|
|
183
187
|
console.log(formatOutput(result, format));
|
|
@@ -315,7 +319,7 @@ Missing locales: ${missingLocales.join(", ")}`);
|
|
|
315
319
|
const result = await listImages(client, packageName, options.lang, imageType);
|
|
316
320
|
console.log(formatOutput(result, format));
|
|
317
321
|
});
|
|
318
|
-
images.command("upload <file>").description("Upload an image").option("--lang <language>", "Language code (BCP 47)").option("--type <type>", "Image type").action(async (file, options) => {
|
|
322
|
+
images.command("upload <file>").description("Upload an image").option("--lang <language>", "Language code (BCP 47)").option("--type <type>", "Image type").option("--changes-not-sent-for-review", "Commit changes without sending for review").option("--error-if-in-review", "Fail if changes are already in review").action(async (file, options) => {
|
|
319
323
|
const config = await loadConfig();
|
|
320
324
|
const packageName = resolvePackageName(program.opts()["app"], config);
|
|
321
325
|
const interactive = isInteractive(program);
|
|
@@ -343,7 +347,7 @@ Missing locales: ${missingLocales.join(", ")}`);
|
|
|
343
347
|
const spinner = createSpinner("Uploading image...");
|
|
344
348
|
if (!program.opts()["quiet"] && process.stderr.isTTY) spinner.start();
|
|
345
349
|
try {
|
|
346
|
-
const result = await uploadImage(client, packageName, options.lang, imageType, file);
|
|
350
|
+
const result = await uploadImage(client, packageName, options.lang, imageType, file, buildCommitOptions(options));
|
|
347
351
|
spinner.stop("Image uploaded");
|
|
348
352
|
console.log(formatOutput(result, format));
|
|
349
353
|
} catch (error) {
|
|
@@ -351,7 +355,7 @@ Missing locales: ${missingLocales.join(", ")}`);
|
|
|
351
355
|
throw error;
|
|
352
356
|
}
|
|
353
357
|
});
|
|
354
|
-
images.command("delete").description("Delete an image").option("--lang <language>", "Language code (BCP 47)").option("--type <type>", "Image type").option("--id <imageId>", "Image ID to delete").action(async (options) => {
|
|
358
|
+
images.command("delete").description("Delete an image").option("--lang <language>", "Language code (BCP 47)").option("--type <type>", "Image type").option("--id <imageId>", "Image ID to delete").option("--changes-not-sent-for-review", "Commit changes without sending for review").option("--error-if-in-review", "Fail if changes are already in review").action(async (options) => {
|
|
355
359
|
const config = await loadConfig();
|
|
356
360
|
const packageName = resolvePackageName(program.opts()["app"], config);
|
|
357
361
|
const interactive = isInteractive(program);
|
|
@@ -383,7 +387,7 @@ Missing locales: ${missingLocales.join(", ")}`);
|
|
|
383
387
|
await requireConfirm(`Delete image "${options.id}"?`, program);
|
|
384
388
|
const client = await getClient(config);
|
|
385
389
|
const imageType = validateImageType(options.type);
|
|
386
|
-
await deleteImage(client, packageName, options.lang, imageType, options.id);
|
|
390
|
+
await deleteImage(client, packageName, options.lang, imageType, options.id, buildCommitOptions(options));
|
|
387
391
|
console.log(`Image "${options.id}" deleted.`);
|
|
388
392
|
});
|
|
389
393
|
images.command("export").description("Export all images to a local directory").option("--dir <path>", "Output directory", "images").option("--lang <language>", "Language code (BCP 47) \u2014 export only this language").option("--type <type>", "Image type \u2014 export only this type").action(async (options) => {
|
|
@@ -424,4 +428,4 @@ Missing locales: ${missingLocales.join(", ")}`);
|
|
|
424
428
|
export {
|
|
425
429
|
registerListingsCommands
|
|
426
430
|
};
|
|
427
|
-
//# sourceMappingURL=listings-
|
|
431
|
+
//# sourceMappingURL=listings-LNX6MQYN.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/listings.ts"],"sourcesContent":["import { resolvePackageName, getClient } from \"../resolve.js\";\nimport type { Command } from \"commander\";\nimport { loadConfig } from \"@gpc-cli/config\";\n\nimport type { ImageType } from \"@gpc-cli/api\";\nimport {\n getListings,\n updateListing,\n deleteListing,\n pullListings,\n pushListings,\n diffListingsEnhanced,\n lintLocalListings,\n analyzeRemoteListings,\n listImages,\n uploadImage,\n deleteImage,\n exportImages,\n getCountryAvailability,\n formatOutput,\n createSpinner,\n GpcError,\n} from \"@gpc-cli/core\";\nimport { getOutputFormat } from \"../format.js\";\nimport { isDryRun, printDryRun } from \"../dry-run.js\";\nimport { isInteractive, requireOption, requireConfirm } from \"../prompt.js\";\nimport { green, red } from \"../colors.js\";\nimport { buildCommitOptions } from \"../commit-options.js\";\n\n\n\nconst VALID_IMAGE_TYPES: ImageType[] = [\n \"phoneScreenshots\",\n \"sevenInchScreenshots\",\n \"tenInchScreenshots\",\n \"tvScreenshots\",\n \"wearScreenshots\",\n \"icon\",\n \"featureGraphic\",\n \"tvBanner\",\n];\n\nfunction validateImageType(type: string): ImageType {\n if (!VALID_IMAGE_TYPES.includes(type as ImageType)) {\n throw new GpcError(\n `Invalid image type \"${type}\". Valid types: ${VALID_IMAGE_TYPES.join(\", \")}`,\n \"LISTINGS_USAGE_ERROR\",\n 2,\n `Use one of: ${VALID_IMAGE_TYPES.join(\", \")}`,\n );\n }\n return type as ImageType;\n}\n\nexport function registerListingsCommands(program: Command): void {\n const listings = program.command(\"listings\").description(\"Manage store listings and metadata\");\n\n // Get\n listings\n .command(\"get\")\n .description(\"Get store listing(s)\")\n .option(\"--lang <language>\", \"Language code (BCP 47)\")\n .action(async (options) => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n const client = await getClient(config);\n const format = getOutputFormat(program, config);\n\n const result = await getListings(client, packageName, options.lang);\n console.log(formatOutput(result, format));\n });\n\n // Update\n listings\n .command(\"update\")\n .description(\"Update a store listing\")\n .option(\"--lang <language>\", \"Language code (BCP 47)\")\n .option(\"--title <text>\", \"App title\")\n .option(\"--short <text>\", \"Short description\")\n .option(\"--full <text>\", \"Full description\")\n .option(\"--full-file <path>\", \"Read full description from file\")\n .option(\"--video <url>\", \"Video URL\")\n .option(\"--changes-not-sent-for-review\", \"Commit changes without sending for review\")\n .option(\"--error-if-in-review\", \"Fail if changes are already in review\")\n .action(async (options) => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n const interactive = isInteractive(program);\n\n options.lang = await requireOption(\n \"lang\",\n options.lang,\n {\n message: \"Language code (BCP 47):\",\n default: \"en-US\",\n },\n interactive,\n );\n const format = getOutputFormat(program, config);\n\n const data: Record<string, string> = {};\n if (options[\"title\"]) data[\"title\"] = options[\"title\"];\n if (options[\"short\"]) data[\"shortDescription\"] = options[\"short\"];\n if (options[\"full\"]) data[\"fullDescription\"] = options[\"full\"];\n if (options[\"fullFile\"]) {\n const { readFile } = await import(\"node:fs/promises\");\n data[\"fullDescription\"] = (await readFile(options[\"fullFile\"], \"utf-8\")).trimEnd();\n }\n if (options[\"video\"]) data[\"video\"] = options[\"video\"];\n\n if (Object.keys(data).length === 0) {\n throw new GpcError(\n \"Provide at least one field to update (--title, --short, --full, --full-file, --video).\",\n \"LISTINGS_USAGE_ERROR\",\n 2,\n \"Pass at least one of: --title, --short, --full, --full-file, --video\",\n );\n }\n\n if (isDryRun(program)) {\n printDryRun(\n {\n command: \"listings update\",\n action: \"update listing for\",\n target: options.lang,\n details: data,\n },\n format,\n formatOutput,\n );\n return;\n }\n\n const client = await getClient(config);\n const result = await updateListing(client, packageName, options.lang, data, buildCommitOptions(options));\n console.log(formatOutput(result, format));\n });\n\n // Delete\n listings\n .command(\"delete\")\n .description(\"Delete a store listing for a language\")\n .option(\"--lang <language>\", \"Language code (BCP 47)\")\n .option(\"--changes-not-sent-for-review\", \"Commit changes without sending for review\")\n .option(\"--error-if-in-review\", \"Fail if changes are already in review\")\n .action(async (options) => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n const interactive = isInteractive(program);\n\n options.lang = await requireOption(\n \"lang\",\n options.lang,\n {\n message: \"Language code (BCP 47):\",\n },\n interactive,\n );\n\n await requireConfirm(`Delete listing for \"${options.lang}\"?`, program);\n\n if (isDryRun(program)) {\n const format = getOutputFormat(program, config);\n printDryRun(\n {\n command: \"listings delete\",\n action: \"delete listing for\",\n target: options.lang,\n },\n format,\n formatOutput,\n );\n return;\n }\n\n const client = await getClient(config);\n\n await deleteListing(client, packageName, options.lang, buildCommitOptions(options));\n console.log(`Listing for \"${options.lang}\" deleted.`);\n });\n\n // Pull\n listings\n .command(\"pull\")\n .description(\"Download listings to Fastlane-format directory\")\n .option(\"--dir <path>\", \"Target directory (default: metadata)\", \"metadata\")\n .action(async (options) => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n const client = await getClient(config);\n const format = getOutputFormat(program, config);\n\n const result = await pullListings(client, packageName, options.dir);\n console.log(\n formatOutput(\n {\n directory: options.dir,\n languages: result.listings.map((l) => l.language),\n count: result.listings.length,\n },\n format,\n ),\n );\n });\n\n // Push\n listings\n .command(\"push\")\n .description(\"Upload listings from Fastlane-format directory\")\n .option(\"--dir <path>\", \"Source directory (default: metadata)\", \"metadata\")\n .option(\"--force\", \"Push even if fields exceed character limits\")\n .option(\"--changes-not-sent-for-review\", \"Commit changes without sending for review\")\n .option(\"--error-if-in-review\", \"Fail if changes are already in review\")\n .action(async (options) => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n const client = await getClient(config);\n const format = getOutputFormat(program, config);\n\n const spinner = createSpinner(\"Pushing listings...\");\n if (!program.opts()[\"quiet\"] && process.stderr.isTTY) spinner.start();\n\n try {\n const dryRun = isDryRun(program);\n const result = await pushListings(client, packageName, options.dir, {\n dryRun,\n force: options.force,\n commitOptions: buildCommitOptions(options),\n });\n spinner.stop(dryRun ? \"Dry-run complete (no changes made)\" : \"Listings pushed\");\n console.log(formatOutput(result, format));\n } catch (error) {\n spinner.fail(\"Push failed\");\n throw error;\n }\n });\n\n // Diff (enhanced: --lang filter, word-level inline diff)\n listings\n .command(\"diff\")\n .description(\"Compare local Fastlane-format metadata against remote listings\")\n .option(\"--dir <path>\", \"Local metadata directory\", \"metadata\")\n .option(\"--lang <language>\", \"Filter diff to a specific language\")\n .option(\"--word-diff\", \"Show word-level inline diff for fullDescription\")\n .action(async (options) => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n const client = await getClient(config);\n const format = getOutputFormat(program, config);\n\n const diffs = await diffListingsEnhanced(client, packageName, options.dir, {\n lang: options.lang,\n wordLevel: options.wordDiff,\n });\n\n if (diffs.length === 0) {\n if (format === \"json\") {\n console.log(formatOutput([], format));\n } else {\n console.log(\"No differences found.\");\n }\n return;\n }\n\n if (format === \"json\") {\n console.log(formatOutput(diffs, format));\n } else {\n for (const diff of diffs) {\n const charInfo = (diff as unknown as Record<string, unknown>)[\"chars\"]\n ? ` (${(diff as unknown as Record<string, unknown>)[\"chars\"]} chars)`\n : \"\";\n console.log(`[${diff.language}] ${diff.field}:${charInfo}`);\n if ((diff as unknown as Record<string, unknown>)[\"diffSummary\"]) {\n console.log(` ${(diff as unknown as Record<string, unknown>)[\"diffSummary\"]}`);\n } else {\n console.log(green(` + local: ${diff.local || \"(empty)\"}`));\n console.log(red(` - remote: ${diff.remote || \"(empty)\"}`));\n }\n }\n }\n });\n\n // Lint (local, no API)\n listings\n .command(\"lint\")\n .description(\"Lint local listing metadata for Play Store character limits (no API)\")\n .option(\"--dir <path>\", \"Metadata directory\", \"metadata\")\n .action(async (options) => {\n const format = getOutputFormat(program, await loadConfig());\n const results = await lintLocalListings(options.dir);\n if (format === \"json\") {\n console.log(formatOutput(results, format));\n return;\n }\n let hasErrors = false;\n for (const r of results) {\n console.log(`\\n[${r.language}] ${r.valid ? green(\"✓ valid\") : red(\"✗ over limit\")}`);\n const rows = r.fields.map((f) => ({\n field: f.field,\n chars: f.chars,\n limit: f.limit,\n pct: `${f.pct}%`,\n status: f.status === \"ok\" ? green(\"✓\") : f.status === \"warn\" ? \"⚠\" : red(\"✗\"),\n }));\n console.log(formatOutput(rows, \"table\"));\n if (!r.valid) hasErrors = true;\n }\n if (hasErrors) {\n process.exitCode = 1;\n }\n });\n\n // Analyze (live, fetches remote)\n listings\n .command(\"analyze\")\n .description(\"Analyze live Play Store listings for character limit compliance\")\n .option(\"--expected <locales>\", \"Comma-separated list of expected locale codes\")\n .action(async (options) => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n const client = await getClient(config);\n const format = getOutputFormat(program, config);\n\n const spinner = createSpinner(\"Fetching remote listings...\");\n if (!program.opts()[\"quiet\"] && process.stderr.isTTY) spinner.start();\n\n try {\n const expectedLocales = options.expected\n ? (options.expected as string).split(\",\").map((s: string) => s.trim())\n : undefined;\n const { results, missingLocales } = await analyzeRemoteListings(client, packageName, {\n expectedLocales,\n });\n spinner.stop(\"Done\");\n\n if (format === \"json\") {\n console.log(formatOutput({ results, missingLocales }, format));\n return;\n }\n\n let hasErrors = false;\n for (const r of results) {\n console.log(`\\n[${r.language}] ${r.valid ? green(\"✓ valid\") : red(\"✗ over limit\")}`);\n const rows = r.fields.map((f) => ({\n field: f.field,\n chars: f.chars,\n limit: f.limit,\n pct: `${f.pct}%`,\n status: f.status === \"ok\" ? green(\"✓\") : f.status === \"warn\" ? \"⚠\" : red(\"✗\"),\n }));\n console.log(formatOutput(rows, \"table\"));\n if (!r.valid) hasErrors = true;\n }\n\n if (missingLocales && missingLocales.length > 0) {\n console.log(`\\nMissing locales: ${missingLocales.join(\", \")}`);\n }\n\n if (hasErrors) {\n process.exitCode = 1;\n }\n } catch (error) {\n spinner.fail(\"Analysis failed\");\n throw error;\n }\n });\n\n // Images subcommand\n const images = listings.command(\"images\").description(\"Manage listing images\");\n\n // Images list\n images\n .command(\"list\")\n .description(\"List images for a language and type\")\n .option(\"--lang <language>\", \"Language code (BCP 47)\")\n .option(\"--type <type>\", \"Image type\")\n .option(\"--limit <n>\", \"Maximum results to return\")\n .option(\"--next-page <token>\", \"Pagination token for next page\")\n .action(async (options) => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n const interactive = isInteractive(program);\n\n options.lang = await requireOption(\n \"lang\",\n options.lang,\n {\n message: \"Language code (BCP 47):\",\n default: \"en-US\",\n },\n interactive,\n );\n\n options.type = await requireOption(\n \"type\",\n options.type,\n {\n message: \"Image type:\",\n choices: VALID_IMAGE_TYPES as unknown as string[],\n },\n interactive,\n );\n\n const client = await getClient(config);\n const format = getOutputFormat(program, config);\n const imageType = validateImageType(options.type);\n\n const result = await listImages(client, packageName, options.lang, imageType);\n console.log(formatOutput(result, format));\n });\n\n // Images upload\n images\n .command(\"upload <file>\")\n .description(\"Upload an image\")\n .option(\"--lang <language>\", \"Language code (BCP 47)\")\n .option(\"--type <type>\", \"Image type\")\n .option(\"--changes-not-sent-for-review\", \"Commit changes without sending for review\")\n .option(\"--error-if-in-review\", \"Fail if changes are already in review\")\n .action(async (file: string, options) => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n const interactive = isInteractive(program);\n\n options.lang = await requireOption(\n \"lang\",\n options.lang,\n {\n message: \"Language code (BCP 47):\",\n default: \"en-US\",\n },\n interactive,\n );\n\n options.type = await requireOption(\n \"type\",\n options.type,\n {\n message: \"Image type:\",\n choices: VALID_IMAGE_TYPES as unknown as string[],\n },\n interactive,\n );\n\n const client = await getClient(config);\n const format = getOutputFormat(program, config);\n const imageType = validateImageType(options.type);\n\n const spinner = createSpinner(\"Uploading image...\");\n if (!program.opts()[\"quiet\"] && process.stderr.isTTY) spinner.start();\n\n try {\n const result = await uploadImage(client, packageName, options.lang, imageType, file, buildCommitOptions(options));\n spinner.stop(\"Image uploaded\");\n console.log(formatOutput(result, format));\n } catch (error) {\n spinner.fail(\"Image upload failed\");\n throw error;\n }\n });\n\n // Images delete\n images\n .command(\"delete\")\n .description(\"Delete an image\")\n .option(\"--lang <language>\", \"Language code (BCP 47)\")\n .option(\"--type <type>\", \"Image type\")\n .option(\"--id <imageId>\", \"Image ID to delete\")\n .option(\"--changes-not-sent-for-review\", \"Commit changes without sending for review\")\n .option(\"--error-if-in-review\", \"Fail if changes are already in review\")\n .action(async (options) => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n const interactive = isInteractive(program);\n\n options.lang = await requireOption(\n \"lang\",\n options.lang,\n {\n message: \"Language code (BCP 47):\",\n },\n interactive,\n );\n\n options.type = await requireOption(\n \"type\",\n options.type,\n {\n message: \"Image type:\",\n choices: VALID_IMAGE_TYPES as unknown as string[],\n },\n interactive,\n );\n\n options.id = await requireOption(\n \"id\",\n options.id,\n {\n message: \"Image ID to delete:\",\n },\n interactive,\n );\n\n await requireConfirm(`Delete image \"${options.id}\"?`, program);\n\n const client = await getClient(config);\n const imageType = validateImageType(options.type);\n\n await deleteImage(client, packageName, options.lang, imageType, options.id, buildCommitOptions(options));\n console.log(`Image \"${options.id}\" deleted.`);\n });\n\n // Images export\n images\n .command(\"export\")\n .description(\"Export all images to a local directory\")\n .option(\"--dir <path>\", \"Output directory\", \"images\")\n .option(\"--lang <language>\", \"Language code (BCP 47) — export only this language\")\n .option(\"--type <type>\", \"Image type — export only this type\")\n .action(async (options) => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n const client = await getClient(config);\n const format = getOutputFormat(program, config);\n\n const exportOpts: { lang?: string; type?: ImageType } = {};\n if (options.lang) exportOpts.lang = options.lang;\n if (options.type) {\n exportOpts.type = validateImageType(options.type);\n }\n\n const spinner = createSpinner(\"Exporting images...\");\n if (!program.opts()[\"quiet\"] && process.stderr.isTTY) spinner.start();\n\n try {\n const result = await exportImages(client, packageName, options.dir, exportOpts);\n spinner.stop(\"Images exported\");\n console.log(formatOutput(result, format));\n } catch (error) {\n spinner.fail(\"Image export failed\");\n throw error;\n }\n });\n\n // Availability\n listings\n .command(\"availability\")\n .description(\"Get country availability for a track\")\n .option(\"--track <track>\", \"Track name\", \"production\")\n .action(async (options) => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n const client = await getClient(config);\n const format = getOutputFormat(program, config);\n\n const result = await getCountryAvailability(client, packageName, options.track);\n const countries = (result as unknown as Record<string, unknown>)[\"countryTargeting\"] as\n | unknown[]\n | undefined;\n if (\n format !== \"json\" &&\n (!countries || (Array.isArray(countries) && countries.length === 0)) &&\n Object.keys(result as object).length === 0\n ) {\n console.log(\"No availability data.\");\n return;\n }\n console.log(formatOutput(result, format));\n });\n}\n"],"mappings":"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","names":[]}
|