@gpc-cli/cli 0.9.7 → 0.9.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/dist/{apps-TZG5GEDW.js → apps-5YQPQ3KB.js} +20 -3
  2. package/dist/apps-5YQPQ3KB.js.map +1 -0
  3. package/dist/bin.js +18 -1
  4. package/dist/bin.js.map +1 -1
  5. package/dist/{chunk-LQ7FJ4QA.js → chunk-ZXEA4KAA.js} +31 -12
  6. package/dist/chunk-ZXEA4KAA.js.map +1 -0
  7. package/dist/{completion-3UYUJD6S.js → completion-C3PPWNS7.js} +68 -1
  8. package/dist/completion-C3PPWNS7.js.map +1 -0
  9. package/dist/device-tiers-FUZC6IHD.js +74 -0
  10. package/dist/device-tiers-FUZC6IHD.js.map +1 -0
  11. package/dist/generated-apks-SUPM3NS3.js +73 -0
  12. package/dist/generated-apks-SUPM3NS3.js.map +1 -0
  13. package/dist/{iap-ZZS5NVFN.js → iap-2CV6SJUF.js} +7 -2
  14. package/dist/iap-2CV6SJUF.js.map +1 -0
  15. package/dist/index.js +1 -1
  16. package/dist/internal-sharing-TWMHLQLN.js +49 -0
  17. package/dist/internal-sharing-TWMHLQLN.js.map +1 -0
  18. package/dist/{listings-FYNMWTIE.js → listings-4QCTOEWL.js} +35 -3
  19. package/dist/listings-4QCTOEWL.js.map +1 -0
  20. package/dist/migrate-5IA6WGMO.js +76 -0
  21. package/dist/migrate-5IA6WGMO.js.map +1 -0
  22. package/dist/one-time-products-BHE6WPZI.js +266 -0
  23. package/dist/one-time-products-BHE6WPZI.js.map +1 -0
  24. package/dist/purchase-options-2NUBLODI.js +145 -0
  25. package/dist/purchase-options-2NUBLODI.js.map +1 -0
  26. package/dist/{recovery-ZANX3WIQ.js → recovery-DC66ZTGD.js} +77 -18
  27. package/dist/recovery-DC66ZTGD.js.map +1 -0
  28. package/dist/{releases-GUMQZRFC.js → releases-HDCDARH5.js} +30 -3
  29. package/dist/releases-HDCDARH5.js.map +1 -0
  30. package/dist/{reports-OJSCABN6.js → reports-T6GBAYUK.js} +2 -2
  31. package/dist/reports-T6GBAYUK.js.map +1 -0
  32. package/dist/{testers-SB77565D.js → testers-NXWT2PFS.js} +2 -2
  33. package/dist/testers-NXWT2PFS.js.map +1 -0
  34. package/dist/tracks-D6FUNJ75.js +84 -0
  35. package/dist/tracks-D6FUNJ75.js.map +1 -0
  36. package/package.json +4 -4
  37. package/dist/apps-TZG5GEDW.js.map +0 -1
  38. package/dist/chunk-LQ7FJ4QA.js.map +0 -1
  39. package/dist/completion-3UYUJD6S.js.map +0 -1
  40. package/dist/iap-ZZS5NVFN.js.map +0 -1
  41. package/dist/listings-FYNMWTIE.js.map +0 -1
  42. package/dist/recovery-ZANX3WIQ.js.map +0 -1
  43. package/dist/releases-GUMQZRFC.js.map +0 -1
  44. package/dist/reports-OJSCABN6.js.map +0 -1
  45. package/dist/testers-SB77565D.js.map +0 -1
  46. package/dist/tracks-HMJ3F55N.js +0 -41
  47. package/dist/tracks-HMJ3F55N.js.map +0 -1
@@ -0,0 +1,266 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ isDryRun,
4
+ printDryRun
5
+ } from "./chunk-Y3QZDAKS.js";
6
+ import {
7
+ requireConfirm
8
+ } from "./chunk-NV75I5VP.js";
9
+
10
+ // src/commands/one-time-products.ts
11
+ import { readFile } from "fs/promises";
12
+ import { loadConfig } from "@gpc-cli/config";
13
+ import { resolveAuth } from "@gpc-cli/auth";
14
+ import { createApiClient } from "@gpc-cli/api";
15
+ import {
16
+ listOneTimeProducts,
17
+ getOneTimeProduct,
18
+ createOneTimeProduct,
19
+ updateOneTimeProduct,
20
+ deleteOneTimeProduct,
21
+ listOneTimeOffers,
22
+ getOneTimeOffer,
23
+ createOneTimeOffer,
24
+ updateOneTimeOffer,
25
+ deleteOneTimeOffer,
26
+ detectOutputFormat,
27
+ formatOutput,
28
+ sortResults
29
+ } from "@gpc-cli/core";
30
+ function resolvePackageName(packageArg, config) {
31
+ const name = packageArg || config.app;
32
+ if (!name) {
33
+ console.error("Error: No package name. Use --app <package> or gpc config set app <package>");
34
+ process.exit(2);
35
+ }
36
+ return name;
37
+ }
38
+ async function getClient(config) {
39
+ const auth = await resolveAuth({ serviceAccountPath: config.auth?.serviceAccount });
40
+ return createApiClient({ auth });
41
+ }
42
+ function registerOneTimeProductsCommands(program) {
43
+ const otp = program.command("one-time-products").alias("otp").description("Manage one-time products and offers (modern OTP API)");
44
+ otp.command("list").description("List one-time products").option("--sort <field>", "Sort by field (prefix with - for descending)").action(async (options) => {
45
+ const config = await loadConfig();
46
+ const packageName = resolvePackageName(program.opts()["app"], config);
47
+ const client = await getClient(config);
48
+ const format = detectOutputFormat();
49
+ try {
50
+ const result = await listOneTimeProducts(client, packageName);
51
+ if (options.sort) {
52
+ result.oneTimeProducts = sortResults(result.oneTimeProducts, options.sort);
53
+ }
54
+ console.log(formatOutput(result, format));
55
+ } catch (error) {
56
+ console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);
57
+ process.exit(4);
58
+ }
59
+ });
60
+ otp.command("get <product-id>").description("Get a one-time product").action(async (productId) => {
61
+ const config = await loadConfig();
62
+ const packageName = resolvePackageName(program.opts()["app"], config);
63
+ const client = await getClient(config);
64
+ const format = detectOutputFormat();
65
+ try {
66
+ const result = await getOneTimeProduct(client, packageName, productId);
67
+ console.log(formatOutput(result, format));
68
+ } catch (error) {
69
+ console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);
70
+ process.exit(4);
71
+ }
72
+ });
73
+ otp.command("create").description("Create a one-time product from JSON file").requiredOption("--file <path>", "JSON file with product data").action(async (options) => {
74
+ const config = await loadConfig();
75
+ const packageName = resolvePackageName(program.opts()["app"], config);
76
+ const format = detectOutputFormat();
77
+ if (isDryRun(program)) {
78
+ printDryRun(
79
+ {
80
+ command: "one-time-products create",
81
+ action: "create",
82
+ target: `one-time product from ${options.file}`
83
+ },
84
+ format,
85
+ formatOutput
86
+ );
87
+ return;
88
+ }
89
+ const client = await getClient(config);
90
+ try {
91
+ const data = JSON.parse(await readFile(options.file, "utf-8"));
92
+ const result = await createOneTimeProduct(client, packageName, data);
93
+ console.log(formatOutput(result, format));
94
+ } catch (error) {
95
+ console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);
96
+ process.exit(4);
97
+ }
98
+ });
99
+ otp.command("update <product-id>").description("Update a one-time product from JSON file").requiredOption("--file <path>", "JSON file with product data").action(async (productId, options) => {
100
+ const config = await loadConfig();
101
+ const packageName = resolvePackageName(program.opts()["app"], config);
102
+ const format = detectOutputFormat();
103
+ if (isDryRun(program)) {
104
+ printDryRun(
105
+ {
106
+ command: "one-time-products update",
107
+ action: "update",
108
+ target: productId,
109
+ details: { file: options.file }
110
+ },
111
+ format,
112
+ formatOutput
113
+ );
114
+ return;
115
+ }
116
+ const client = await getClient(config);
117
+ try {
118
+ const data = JSON.parse(await readFile(options.file, "utf-8"));
119
+ const result = await updateOneTimeProduct(client, packageName, productId, data);
120
+ console.log(formatOutput(result, format));
121
+ } catch (error) {
122
+ console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);
123
+ process.exit(4);
124
+ }
125
+ });
126
+ otp.command("delete <product-id>").description("Delete a one-time product").action(async (productId) => {
127
+ const config = await loadConfig();
128
+ const packageName = resolvePackageName(program.opts()["app"], config);
129
+ await requireConfirm(`Delete one-time product "${productId}"?`, program);
130
+ if (isDryRun(program)) {
131
+ const format = detectOutputFormat();
132
+ printDryRun(
133
+ {
134
+ command: "one-time-products delete",
135
+ action: "delete",
136
+ target: productId
137
+ },
138
+ format,
139
+ formatOutput
140
+ );
141
+ return;
142
+ }
143
+ const client = await getClient(config);
144
+ try {
145
+ await deleteOneTimeProduct(client, packageName, productId);
146
+ console.log(`One-time product ${productId} deleted.`);
147
+ } catch (error) {
148
+ console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);
149
+ process.exit(4);
150
+ }
151
+ });
152
+ const offers = otp.command("offers").description("Manage one-time product offers");
153
+ offers.command("list <product-id>").description("List offers for a one-time product").option("--sort <field>", "Sort by field (prefix with - for descending)").action(async (productId, options) => {
154
+ const config = await loadConfig();
155
+ const packageName = resolvePackageName(program.opts()["app"], config);
156
+ const client = await getClient(config);
157
+ const format = detectOutputFormat();
158
+ try {
159
+ const result = await listOneTimeOffers(client, packageName, productId);
160
+ if (options.sort) {
161
+ result.oneTimeOffers = sortResults(result.oneTimeOffers, options.sort);
162
+ }
163
+ console.log(formatOutput(result, format));
164
+ } catch (error) {
165
+ console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);
166
+ process.exit(4);
167
+ }
168
+ });
169
+ offers.command("get <product-id> <offer-id>").description("Get an offer for a one-time product").action(async (productId, offerId) => {
170
+ const config = await loadConfig();
171
+ const packageName = resolvePackageName(program.opts()["app"], config);
172
+ const client = await getClient(config);
173
+ const format = detectOutputFormat();
174
+ try {
175
+ const result = await getOneTimeOffer(client, packageName, productId, offerId);
176
+ console.log(formatOutput(result, format));
177
+ } catch (error) {
178
+ console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);
179
+ process.exit(4);
180
+ }
181
+ });
182
+ offers.command("create <product-id>").description("Create an offer from JSON file").requiredOption("--file <path>", "JSON file with offer data").action(async (productId, options) => {
183
+ const config = await loadConfig();
184
+ const packageName = resolvePackageName(program.opts()["app"], config);
185
+ const format = detectOutputFormat();
186
+ if (isDryRun(program)) {
187
+ printDryRun(
188
+ {
189
+ command: "one-time-products offers create",
190
+ action: "create offer for",
191
+ target: productId,
192
+ details: { file: options.file }
193
+ },
194
+ format,
195
+ formatOutput
196
+ );
197
+ return;
198
+ }
199
+ const client = await getClient(config);
200
+ try {
201
+ const data = JSON.parse(await readFile(options.file, "utf-8"));
202
+ const result = await createOneTimeOffer(client, packageName, productId, data);
203
+ console.log(formatOutput(result, format));
204
+ } catch (error) {
205
+ console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);
206
+ process.exit(4);
207
+ }
208
+ });
209
+ offers.command("update <product-id> <offer-id>").description("Update an offer from JSON file").requiredOption("--file <path>", "JSON file with offer data").action(async (productId, offerId, options) => {
210
+ const config = await loadConfig();
211
+ const packageName = resolvePackageName(program.opts()["app"], config);
212
+ const format = detectOutputFormat();
213
+ if (isDryRun(program)) {
214
+ printDryRun(
215
+ {
216
+ command: "one-time-products offers update",
217
+ action: "update offer",
218
+ target: `${productId}/${offerId}`,
219
+ details: { file: options.file }
220
+ },
221
+ format,
222
+ formatOutput
223
+ );
224
+ return;
225
+ }
226
+ const client = await getClient(config);
227
+ try {
228
+ const data = JSON.parse(await readFile(options.file, "utf-8"));
229
+ const result = await updateOneTimeOffer(client, packageName, productId, offerId, data);
230
+ console.log(formatOutput(result, format));
231
+ } catch (error) {
232
+ console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);
233
+ process.exit(4);
234
+ }
235
+ });
236
+ offers.command("delete <product-id> <offer-id>").description("Delete an offer").action(async (productId, offerId) => {
237
+ const config = await loadConfig();
238
+ const packageName = resolvePackageName(program.opts()["app"], config);
239
+ await requireConfirm(`Delete offer "${offerId}" for product "${productId}"?`, program);
240
+ if (isDryRun(program)) {
241
+ const format = detectOutputFormat();
242
+ printDryRun(
243
+ {
244
+ command: "one-time-products offers delete",
245
+ action: "delete offer",
246
+ target: `${productId}/${offerId}`
247
+ },
248
+ format,
249
+ formatOutput
250
+ );
251
+ return;
252
+ }
253
+ const client = await getClient(config);
254
+ try {
255
+ await deleteOneTimeOffer(client, packageName, productId, offerId);
256
+ console.log(`Offer ${offerId} deleted.`);
257
+ } catch (error) {
258
+ console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);
259
+ process.exit(4);
260
+ }
261
+ });
262
+ }
263
+ export {
264
+ registerOneTimeProductsCommands
265
+ };
266
+ //# sourceMappingURL=one-time-products-BHE6WPZI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/one-time-products.ts"],"sourcesContent":["import { readFile } from \"node:fs/promises\";\nimport type { GpcConfig } from \"@gpc-cli/config\";\nimport type { Command } from \"commander\";\nimport { loadConfig } from \"@gpc-cli/config\";\nimport { resolveAuth } from \"@gpc-cli/auth\";\nimport { createApiClient } from \"@gpc-cli/api\";\nimport {\n listOneTimeProducts,\n getOneTimeProduct,\n createOneTimeProduct,\n updateOneTimeProduct,\n deleteOneTimeProduct,\n listOneTimeOffers,\n getOneTimeOffer,\n createOneTimeOffer,\n updateOneTimeOffer,\n deleteOneTimeOffer,\n detectOutputFormat,\n formatOutput,\n sortResults,\n} from \"@gpc-cli/core\";\nimport { isDryRun, printDryRun } from \"../dry-run.js\";\nimport { requireConfirm } from \"../prompt.js\";\n\nfunction resolvePackageName(packageArg: string | undefined, config: GpcConfig): string {\n const name = packageArg || config.app;\n if (!name) {\n console.error(\"Error: No package name. Use --app <package> or gpc config set app <package>\");\n process.exit(2);\n }\n return name;\n}\n\nasync function getClient(config: GpcConfig) {\n const auth = await resolveAuth({ serviceAccountPath: config.auth?.serviceAccount });\n return createApiClient({ auth });\n}\n\nexport function registerOneTimeProductsCommands(program: Command): void {\n const otp = program\n .command(\"one-time-products\")\n .alias(\"otp\")\n .description(\"Manage one-time products and offers (modern OTP API)\");\n\n otp\n .command(\"list\")\n .description(\"List one-time products\")\n .option(\"--sort <field>\", \"Sort by field (prefix with - for descending)\")\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 = detectOutputFormat();\n\n try {\n const result = await listOneTimeProducts(client, packageName);\n if (options.sort) {\n result.oneTimeProducts = sortResults(result.oneTimeProducts, options.sort);\n }\n console.log(formatOutput(result, format));\n } catch (error) {\n console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);\n process.exit(4);\n }\n });\n\n otp\n .command(\"get <product-id>\")\n .description(\"Get a one-time product\")\n .action(async (productId: string) => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n const client = await getClient(config);\n const format = detectOutputFormat();\n\n try {\n const result = await getOneTimeProduct(client, packageName, productId);\n console.log(formatOutput(result, format));\n } catch (error) {\n console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);\n process.exit(4);\n }\n });\n\n otp\n .command(\"create\")\n .description(\"Create a one-time product from JSON file\")\n .requiredOption(\"--file <path>\", \"JSON file with product data\")\n .action(async (options) => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n const format = detectOutputFormat();\n\n if (isDryRun(program)) {\n printDryRun(\n {\n command: \"one-time-products create\",\n action: \"create\",\n target: `one-time product from ${options.file}`,\n },\n format,\n formatOutput,\n );\n return;\n }\n\n const client = await getClient(config);\n\n try {\n const data = JSON.parse(await readFile(options.file, \"utf-8\"));\n const result = await createOneTimeProduct(client, packageName, data);\n console.log(formatOutput(result, format));\n } catch (error) {\n console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);\n process.exit(4);\n }\n });\n\n otp\n .command(\"update <product-id>\")\n .description(\"Update a one-time product from JSON file\")\n .requiredOption(\"--file <path>\", \"JSON file with product data\")\n .action(async (productId: string, options) => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n const format = detectOutputFormat();\n\n if (isDryRun(program)) {\n printDryRun(\n {\n command: \"one-time-products update\",\n action: \"update\",\n target: productId,\n details: { file: options.file },\n },\n format,\n formatOutput,\n );\n return;\n }\n\n const client = await getClient(config);\n\n try {\n const data = JSON.parse(await readFile(options.file, \"utf-8\"));\n const result = await updateOneTimeProduct(client, packageName, productId, data);\n console.log(formatOutput(result, format));\n } catch (error) {\n console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);\n process.exit(4);\n }\n });\n\n otp\n .command(\"delete <product-id>\")\n .description(\"Delete a one-time product\")\n .action(async (productId: string) => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n\n await requireConfirm(`Delete one-time product \"${productId}\"?`, program);\n\n if (isDryRun(program)) {\n const format = detectOutputFormat();\n printDryRun(\n {\n command: \"one-time-products delete\",\n action: \"delete\",\n target: productId,\n },\n format,\n formatOutput,\n );\n return;\n }\n\n const client = await getClient(config);\n\n try {\n await deleteOneTimeProduct(client, packageName, productId);\n console.log(`One-time product ${productId} deleted.`);\n } catch (error) {\n console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);\n process.exit(4);\n }\n });\n\n // --- Offers ---\n const offers = otp.command(\"offers\").description(\"Manage one-time product offers\");\n\n offers\n .command(\"list <product-id>\")\n .description(\"List offers for a one-time product\")\n .option(\"--sort <field>\", \"Sort by field (prefix with - for descending)\")\n .action(async (productId: string, options) => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n const client = await getClient(config);\n const format = detectOutputFormat();\n\n try {\n const result = await listOneTimeOffers(client, packageName, productId);\n if (options.sort) {\n result.oneTimeOffers = sortResults(result.oneTimeOffers, options.sort);\n }\n console.log(formatOutput(result, format));\n } catch (error) {\n console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);\n process.exit(4);\n }\n });\n\n offers\n .command(\"get <product-id> <offer-id>\")\n .description(\"Get an offer for a one-time product\")\n .action(async (productId: string, offerId: string) => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n const client = await getClient(config);\n const format = detectOutputFormat();\n\n try {\n const result = await getOneTimeOffer(client, packageName, productId, offerId);\n console.log(formatOutput(result, format));\n } catch (error) {\n console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);\n process.exit(4);\n }\n });\n\n offers\n .command(\"create <product-id>\")\n .description(\"Create an offer from JSON file\")\n .requiredOption(\"--file <path>\", \"JSON file with offer data\")\n .action(async (productId: string, options: { file: string }) => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n const format = detectOutputFormat();\n\n if (isDryRun(program)) {\n printDryRun(\n {\n command: \"one-time-products offers create\",\n action: \"create offer for\",\n target: productId,\n details: { file: options.file },\n },\n format,\n formatOutput,\n );\n return;\n }\n\n const client = await getClient(config);\n\n try {\n const data = JSON.parse(await readFile(options.file, \"utf-8\"));\n const result = await createOneTimeOffer(client, packageName, productId, data);\n console.log(formatOutput(result, format));\n } catch (error) {\n console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);\n process.exit(4);\n }\n });\n\n offers\n .command(\"update <product-id> <offer-id>\")\n .description(\"Update an offer from JSON file\")\n .requiredOption(\"--file <path>\", \"JSON file with offer data\")\n .action(async (productId: string, offerId: string, options: { file: string }) => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n const format = detectOutputFormat();\n\n if (isDryRun(program)) {\n printDryRun(\n {\n command: \"one-time-products offers update\",\n action: \"update offer\",\n target: `${productId}/${offerId}`,\n details: { file: options.file },\n },\n format,\n formatOutput,\n );\n return;\n }\n\n const client = await getClient(config);\n\n try {\n const data = JSON.parse(await readFile(options.file, \"utf-8\"));\n const result = await updateOneTimeOffer(client, packageName, productId, offerId, data);\n console.log(formatOutput(result, format));\n } catch (error) {\n console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);\n process.exit(4);\n }\n });\n\n offers\n .command(\"delete <product-id> <offer-id>\")\n .description(\"Delete an offer\")\n .action(async (productId: string, offerId: string) => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n\n await requireConfirm(`Delete offer \"${offerId}\" for product \"${productId}\"?`, program);\n\n if (isDryRun(program)) {\n const format = detectOutputFormat();\n printDryRun(\n {\n command: \"one-time-products offers delete\",\n action: \"delete offer\",\n target: `${productId}/${offerId}`,\n },\n format,\n formatOutput,\n );\n return;\n }\n\n const client = await getClient(config);\n\n try {\n await deleteOneTimeOffer(client, packageName, productId, offerId);\n console.log(`Offer ${offerId} deleted.`);\n } catch (error) {\n console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);\n process.exit(4);\n }\n });\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,145 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ isDryRun,
4
+ printDryRun
5
+ } from "./chunk-Y3QZDAKS.js";
6
+
7
+ // src/commands/purchase-options.ts
8
+ import { readFile } from "fs/promises";
9
+ import { loadConfig } from "@gpc-cli/config";
10
+ import { resolveAuth } from "@gpc-cli/auth";
11
+ import { createApiClient } from "@gpc-cli/api";
12
+ import {
13
+ listPurchaseOptions,
14
+ getPurchaseOption,
15
+ createPurchaseOption,
16
+ activatePurchaseOption,
17
+ deactivatePurchaseOption,
18
+ detectOutputFormat,
19
+ formatOutput,
20
+ sortResults
21
+ } from "@gpc-cli/core";
22
+ function resolvePackageName(packageArg, config) {
23
+ const name = packageArg || config.app;
24
+ if (!name) {
25
+ console.error("Error: No package name. Use --app <package> or gpc config set app <package>");
26
+ process.exit(2);
27
+ }
28
+ return name;
29
+ }
30
+ async function getClient(config) {
31
+ const auth = await resolveAuth({ serviceAccountPath: config.auth?.serviceAccount });
32
+ return createApiClient({ auth });
33
+ }
34
+ function registerPurchaseOptionsCommands(program) {
35
+ const po = program.command("purchase-options").description("Manage purchase options");
36
+ po.command("list").description("List purchase options").option("--sort <field>", "Sort by field (prefix with - for descending)").action(async (options) => {
37
+ const config = await loadConfig();
38
+ const packageName = resolvePackageName(program.opts()["app"], config);
39
+ const client = await getClient(config);
40
+ const format = detectOutputFormat();
41
+ try {
42
+ const result = await listPurchaseOptions(client, packageName);
43
+ if (options.sort) {
44
+ result.purchaseOptions = sortResults(result.purchaseOptions, options.sort);
45
+ }
46
+ console.log(formatOutput(result, format));
47
+ } catch (error) {
48
+ console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);
49
+ process.exit(4);
50
+ }
51
+ });
52
+ po.command("get <id>").description("Get a purchase option").action(async (id) => {
53
+ const config = await loadConfig();
54
+ const packageName = resolvePackageName(program.opts()["app"], config);
55
+ const client = await getClient(config);
56
+ const format = detectOutputFormat();
57
+ try {
58
+ const result = await getPurchaseOption(client, packageName, id);
59
+ console.log(formatOutput(result, format));
60
+ } catch (error) {
61
+ console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);
62
+ process.exit(4);
63
+ }
64
+ });
65
+ po.command("create").description("Create a purchase option from JSON file").requiredOption("--file <path>", "JSON file with purchase option data").action(async (options) => {
66
+ const config = await loadConfig();
67
+ const packageName = resolvePackageName(program.opts()["app"], config);
68
+ const format = detectOutputFormat();
69
+ if (isDryRun(program)) {
70
+ printDryRun(
71
+ {
72
+ command: "purchase-options create",
73
+ action: "create",
74
+ target: `purchase option from ${options.file}`
75
+ },
76
+ format,
77
+ formatOutput
78
+ );
79
+ return;
80
+ }
81
+ const client = await getClient(config);
82
+ try {
83
+ const data = JSON.parse(await readFile(options.file, "utf-8"));
84
+ const result = await createPurchaseOption(client, packageName, data);
85
+ console.log(formatOutput(result, format));
86
+ } catch (error) {
87
+ console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);
88
+ process.exit(4);
89
+ }
90
+ });
91
+ po.command("activate <id>").description("Activate a purchase option").action(async (id) => {
92
+ const config = await loadConfig();
93
+ const packageName = resolvePackageName(program.opts()["app"], config);
94
+ const format = detectOutputFormat();
95
+ if (isDryRun(program)) {
96
+ printDryRun(
97
+ {
98
+ command: "purchase-options activate",
99
+ action: "activate",
100
+ target: id
101
+ },
102
+ format,
103
+ formatOutput
104
+ );
105
+ return;
106
+ }
107
+ const client = await getClient(config);
108
+ try {
109
+ const result = await activatePurchaseOption(client, packageName, id);
110
+ console.log(formatOutput(result, format));
111
+ } catch (error) {
112
+ console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);
113
+ process.exit(4);
114
+ }
115
+ });
116
+ po.command("deactivate <id>").description("Deactivate a purchase option").action(async (id) => {
117
+ const config = await loadConfig();
118
+ const packageName = resolvePackageName(program.opts()["app"], config);
119
+ const format = detectOutputFormat();
120
+ if (isDryRun(program)) {
121
+ printDryRun(
122
+ {
123
+ command: "purchase-options deactivate",
124
+ action: "deactivate",
125
+ target: id
126
+ },
127
+ format,
128
+ formatOutput
129
+ );
130
+ return;
131
+ }
132
+ const client = await getClient(config);
133
+ try {
134
+ const result = await deactivatePurchaseOption(client, packageName, id);
135
+ console.log(formatOutput(result, format));
136
+ } catch (error) {
137
+ console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);
138
+ process.exit(4);
139
+ }
140
+ });
141
+ }
142
+ export {
143
+ registerPurchaseOptionsCommands
144
+ };
145
+ //# sourceMappingURL=purchase-options-2NUBLODI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/purchase-options.ts"],"sourcesContent":["import { readFile } from \"node:fs/promises\";\nimport type { GpcConfig } from \"@gpc-cli/config\";\nimport type { Command } from \"commander\";\nimport { loadConfig } from \"@gpc-cli/config\";\nimport { resolveAuth } from \"@gpc-cli/auth\";\nimport { createApiClient } from \"@gpc-cli/api\";\nimport {\n listPurchaseOptions,\n getPurchaseOption,\n createPurchaseOption,\n activatePurchaseOption,\n deactivatePurchaseOption,\n detectOutputFormat,\n formatOutput,\n sortResults,\n} from \"@gpc-cli/core\";\nimport { isDryRun, printDryRun } from \"../dry-run.js\";\n\nfunction resolvePackageName(packageArg: string | undefined, config: GpcConfig): string {\n const name = packageArg || config.app;\n if (!name) {\n console.error(\"Error: No package name. Use --app <package> or gpc config set app <package>\");\n process.exit(2);\n }\n return name;\n}\n\nasync function getClient(config: GpcConfig) {\n const auth = await resolveAuth({ serviceAccountPath: config.auth?.serviceAccount });\n return createApiClient({ auth });\n}\n\nexport function registerPurchaseOptionsCommands(program: Command): void {\n const po = program\n .command(\"purchase-options\")\n .description(\"Manage purchase options\");\n\n po.command(\"list\")\n .description(\"List purchase options\")\n .option(\"--sort <field>\", \"Sort by field (prefix with - for descending)\")\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 = detectOutputFormat();\n\n try {\n const result = await listPurchaseOptions(client, packageName);\n if (options.sort) {\n result.purchaseOptions = sortResults(result.purchaseOptions, options.sort);\n }\n console.log(formatOutput(result, format));\n } catch (error) {\n console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);\n process.exit(4);\n }\n });\n\n po.command(\"get <id>\")\n .description(\"Get a purchase option\")\n .action(async (id: string) => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n const client = await getClient(config);\n const format = detectOutputFormat();\n\n try {\n const result = await getPurchaseOption(client, packageName, id);\n console.log(formatOutput(result, format));\n } catch (error) {\n console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);\n process.exit(4);\n }\n });\n\n po.command(\"create\")\n .description(\"Create a purchase option from JSON file\")\n .requiredOption(\"--file <path>\", \"JSON file with purchase option data\")\n .action(async (options) => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n const format = detectOutputFormat();\n\n if (isDryRun(program)) {\n printDryRun(\n {\n command: \"purchase-options create\",\n action: \"create\",\n target: `purchase option from ${options.file}`,\n },\n format,\n formatOutput,\n );\n return;\n }\n\n const client = await getClient(config);\n\n try {\n const data = JSON.parse(await readFile(options.file, \"utf-8\"));\n const result = await createPurchaseOption(client, packageName, data);\n console.log(formatOutput(result, format));\n } catch (error) {\n console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);\n process.exit(4);\n }\n });\n\n po.command(\"activate <id>\")\n .description(\"Activate a purchase option\")\n .action(async (id: string) => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n const format = detectOutputFormat();\n\n if (isDryRun(program)) {\n printDryRun(\n {\n command: \"purchase-options activate\",\n action: \"activate\",\n target: id,\n },\n format,\n formatOutput,\n );\n return;\n }\n\n const client = await getClient(config);\n\n try {\n const result = await activatePurchaseOption(client, packageName, id);\n console.log(formatOutput(result, format));\n } catch (error) {\n console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);\n process.exit(4);\n }\n });\n\n po.command(\"deactivate <id>\")\n .description(\"Deactivate a purchase option\")\n .action(async (id: string) => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n const format = detectOutputFormat();\n\n if (isDryRun(program)) {\n printDryRun(\n {\n command: \"purchase-options deactivate\",\n action: \"deactivate\",\n target: id,\n },\n format,\n formatOutput,\n );\n return;\n }\n\n const client = await getClient(config);\n\n try {\n const result = await deactivatePurchaseOption(client, packageName, id);\n console.log(formatOutput(result, format));\n } catch (error) {\n console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);\n process.exit(4);\n }\n });\n}\n"],"mappings":"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","names":[]}
@@ -15,9 +15,12 @@ import {
15
15
  listRecoveryActions,
16
16
  cancelRecoveryAction,
17
17
  deployRecoveryAction,
18
+ createRecoveryAction,
19
+ addRecoveryTargeting,
18
20
  detectOutputFormat,
19
21
  formatOutput
20
22
  } from "@gpc-cli/core";
23
+ import { readFileSync } from "fs";
21
24
  function resolvePackageName(packageArg, config) {
22
25
  const name = packageArg || config.app;
23
26
  if (!name) {
@@ -32,7 +35,7 @@ async function getClient(config) {
32
35
  }
33
36
  function registerRecoveryCommands(program) {
34
37
  const recovery = program.command("recovery").description("Manage app recovery actions");
35
- recovery.command("list").description("List app recovery actions").action(async () => {
38
+ recovery.command("list").description("List app recovery actions").option("--limit <n>", "Maximum results to return").option("--next-page <token>", "Pagination token for next page").action(async (options) => {
36
39
  const config = await loadConfig();
37
40
  const packageName = resolvePackageName(program.opts()["app"], config);
38
41
  const client = await getClient(config);
@@ -61,14 +64,7 @@ function registerRecoveryCommands(program) {
61
64
  );
62
65
  return;
63
66
  }
64
- const confirmed = await requireConfirm(
65
- `Cancel recovery action ${id}?`,
66
- program.opts()["yes"]
67
- );
68
- if (!confirmed) {
69
- console.log("Cancelled.");
70
- return;
71
- }
67
+ await requireConfirm(`Cancel recovery action ${id}?`, program);
72
68
  const client = await getClient(config);
73
69
  try {
74
70
  await cancelRecoveryAction(client, packageName, id);
@@ -94,14 +90,7 @@ function registerRecoveryCommands(program) {
94
90
  );
95
91
  return;
96
92
  }
97
- const confirmed = await requireConfirm(
98
- `Deploy recovery action ${id}?`,
99
- program.opts()["yes"]
100
- );
101
- if (!confirmed) {
102
- console.log("Cancelled.");
103
- return;
104
- }
93
+ await requireConfirm(`Deploy recovery action ${id}?`, program);
105
94
  const client = await getClient(config);
106
95
  try {
107
96
  await deployRecoveryAction(client, packageName, id);
@@ -111,8 +100,78 @@ function registerRecoveryCommands(program) {
111
100
  process.exit(4);
112
101
  }
113
102
  });
103
+ recovery.command("create").description("Create a new app recovery action").requiredOption("--file <path>", "Path to JSON file with recovery action data").action(async (options) => {
104
+ const config = await loadConfig();
105
+ const packageName = resolvePackageName(program.opts()["app"], config);
106
+ const format = detectOutputFormat();
107
+ let data;
108
+ try {
109
+ data = JSON.parse(readFileSync(options.file, "utf-8"));
110
+ } catch (err) {
111
+ console.error(
112
+ `Error: Could not read recovery action data from ${options.file}: ${err instanceof Error ? err.message : String(err)}`
113
+ );
114
+ process.exit(2);
115
+ }
116
+ if (isDryRun(program)) {
117
+ printDryRun(
118
+ {
119
+ command: "recovery create",
120
+ action: "create recovery action",
121
+ target: packageName,
122
+ details: data
123
+ },
124
+ format,
125
+ formatOutput
126
+ );
127
+ return;
128
+ }
129
+ const client = await getClient(config);
130
+ try {
131
+ const result = await createRecoveryAction(client, packageName, data);
132
+ console.log(formatOutput(result, format));
133
+ } catch (error) {
134
+ console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);
135
+ process.exit(4);
136
+ }
137
+ });
138
+ recovery.command("add-targeting <action-id>").description("Add targeting rules to an existing recovery action").requiredOption("--file <path>", "Path to JSON file with targeting data").action(async (actionId, options) => {
139
+ const config = await loadConfig();
140
+ const packageName = resolvePackageName(program.opts()["app"], config);
141
+ const format = detectOutputFormat();
142
+ let targeting;
143
+ try {
144
+ targeting = JSON.parse(readFileSync(options.file, "utf-8"));
145
+ } catch (err) {
146
+ console.error(
147
+ `Error: Could not read targeting data from ${options.file}: ${err instanceof Error ? err.message : String(err)}`
148
+ );
149
+ process.exit(2);
150
+ }
151
+ if (isDryRun(program)) {
152
+ printDryRun(
153
+ {
154
+ command: "recovery add-targeting",
155
+ action: "add targeting to recovery action",
156
+ target: actionId,
157
+ details: targeting
158
+ },
159
+ format,
160
+ formatOutput
161
+ );
162
+ return;
163
+ }
164
+ const client = await getClient(config);
165
+ try {
166
+ const result = await addRecoveryTargeting(client, packageName, actionId, targeting);
167
+ console.log(formatOutput(result, format));
168
+ } catch (error) {
169
+ console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);
170
+ process.exit(4);
171
+ }
172
+ });
114
173
  }
115
174
  export {
116
175
  registerRecoveryCommands
117
176
  };
118
- //# sourceMappingURL=recovery-ZANX3WIQ.js.map
177
+ //# sourceMappingURL=recovery-DC66ZTGD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/recovery.ts"],"sourcesContent":["import type { Command } from \"commander\";\nimport type { GpcConfig } from \"@gpc-cli/config\";\nimport { loadConfig } from \"@gpc-cli/config\";\nimport { resolveAuth } from \"@gpc-cli/auth\";\nimport { createApiClient } from \"@gpc-cli/api\";\nimport {\n listRecoveryActions,\n cancelRecoveryAction,\n deployRecoveryAction,\n createRecoveryAction,\n addRecoveryTargeting,\n detectOutputFormat,\n formatOutput,\n} from \"@gpc-cli/core\";\nimport { isDryRun, printDryRun } from \"../dry-run.js\";\nimport { requireConfirm } from \"../prompt.js\";\nimport { readFileSync } from \"node:fs\";\n\nfunction resolvePackageName(packageArg: string | undefined, config: GpcConfig): string {\n const name = packageArg || config.app;\n if (!name) {\n console.error(\"Error: No package name. Use --app <package> or gpc config set app <package>\");\n process.exit(2);\n }\n return name;\n}\n\nasync function getClient(config: GpcConfig) {\n const auth = await resolveAuth({ serviceAccountPath: config.auth?.serviceAccount });\n return createApiClient({ auth });\n}\n\nexport function registerRecoveryCommands(program: Command): void {\n const recovery = program.command(\"recovery\").description(\"Manage app recovery actions\");\n\n recovery\n .command(\"list\")\n .description(\"List app recovery actions\")\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 client = await getClient(config);\n const format = detectOutputFormat();\n\n try {\n const result = await listRecoveryActions(client, packageName);\n console.log(formatOutput(result, format));\n } catch (error) {\n console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);\n process.exit(4);\n }\n });\n\n recovery\n .command(\"cancel <id>\")\n .description(\"Cancel a recovery action\")\n .action(async (id: string) => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n const format = detectOutputFormat();\n\n if (isDryRun(program)) {\n printDryRun(\n {\n command: \"recovery cancel\",\n action: \"cancel\",\n target: id,\n },\n format,\n formatOutput,\n );\n return;\n }\n\n await requireConfirm(`Cancel recovery action ${id}?`, program);\n\n const client = await getClient(config);\n\n try {\n await cancelRecoveryAction(client, packageName, id);\n console.log(formatOutput({ success: true, appRecoveryId: id, action: \"cancelled\" }, format));\n } catch (error) {\n console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);\n process.exit(4);\n }\n });\n\n recovery\n .command(\"deploy <id>\")\n .description(\"Deploy a recovery action\")\n .action(async (id: string) => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n const format = detectOutputFormat();\n\n if (isDryRun(program)) {\n printDryRun(\n {\n command: \"recovery deploy\",\n action: \"deploy\",\n target: id,\n },\n format,\n formatOutput,\n );\n return;\n }\n\n await requireConfirm(`Deploy recovery action ${id}?`, program);\n\n const client = await getClient(config);\n\n try {\n await deployRecoveryAction(client, packageName, id);\n console.log(formatOutput({ success: true, appRecoveryId: id, action: \"deployed\" }, format));\n } catch (error) {\n console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);\n process.exit(4);\n }\n });\n\n recovery\n .command(\"create\")\n .description(\"Create a new app recovery action\")\n .requiredOption(\"--file <path>\", \"Path to JSON file with recovery action data\")\n .action(async (options) => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n const format = detectOutputFormat();\n\n let data: Record<string, unknown>;\n try {\n data = JSON.parse(readFileSync(options.file, \"utf-8\"));\n } catch (err) {\n console.error(\n `Error: Could not read recovery action data from ${options.file}: ${err instanceof Error ? err.message : String(err)}`,\n );\n process.exit(2);\n }\n\n if (isDryRun(program)) {\n printDryRun(\n {\n command: \"recovery create\",\n action: \"create recovery action\",\n target: packageName,\n details: data,\n },\n format,\n formatOutput,\n );\n return;\n }\n\n const client = await getClient(config);\n\n try {\n const result = await createRecoveryAction(client, packageName, data);\n console.log(formatOutput(result, format));\n } catch (error) {\n console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);\n process.exit(4);\n }\n });\n\n recovery\n .command(\"add-targeting <action-id>\")\n .description(\"Add targeting rules to an existing recovery action\")\n .requiredOption(\"--file <path>\", \"Path to JSON file with targeting data\")\n .action(async (actionId: string, options) => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n const format = detectOutputFormat();\n\n let targeting: Record<string, unknown>;\n try {\n targeting = JSON.parse(readFileSync(options.file, \"utf-8\"));\n } catch (err) {\n console.error(\n `Error: Could not read targeting data from ${options.file}: ${err instanceof Error ? err.message : String(err)}`,\n );\n process.exit(2);\n }\n\n if (isDryRun(program)) {\n printDryRun(\n {\n command: \"recovery add-targeting\",\n action: \"add targeting to recovery action\",\n target: actionId,\n details: targeting,\n },\n format,\n formatOutput,\n );\n return;\n }\n\n const client = await getClient(config);\n\n try {\n const result = await addRecoveryTargeting(client, packageName, actionId, targeting);\n console.log(formatOutput(result, format));\n } catch (error) {\n console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);\n process.exit(4);\n }\n });\n}\n"],"mappings":"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","names":[]}