@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.
- package/dist/{apps-TZG5GEDW.js → apps-5YQPQ3KB.js} +20 -3
- package/dist/apps-5YQPQ3KB.js.map +1 -0
- package/dist/bin.js +18 -1
- package/dist/bin.js.map +1 -1
- package/dist/{chunk-LQ7FJ4QA.js → chunk-ZXEA4KAA.js} +31 -12
- package/dist/chunk-ZXEA4KAA.js.map +1 -0
- package/dist/{completion-3UYUJD6S.js → completion-C3PPWNS7.js} +68 -1
- package/dist/completion-C3PPWNS7.js.map +1 -0
- package/dist/device-tiers-FUZC6IHD.js +74 -0
- package/dist/device-tiers-FUZC6IHD.js.map +1 -0
- package/dist/generated-apks-SUPM3NS3.js +73 -0
- package/dist/generated-apks-SUPM3NS3.js.map +1 -0
- package/dist/{iap-ZZS5NVFN.js → iap-2CV6SJUF.js} +7 -2
- package/dist/iap-2CV6SJUF.js.map +1 -0
- package/dist/index.js +1 -1
- package/dist/internal-sharing-TWMHLQLN.js +49 -0
- package/dist/internal-sharing-TWMHLQLN.js.map +1 -0
- package/dist/{listings-FYNMWTIE.js → listings-4QCTOEWL.js} +35 -3
- package/dist/listings-4QCTOEWL.js.map +1 -0
- package/dist/migrate-5IA6WGMO.js +76 -0
- package/dist/migrate-5IA6WGMO.js.map +1 -0
- package/dist/one-time-products-BHE6WPZI.js +266 -0
- package/dist/one-time-products-BHE6WPZI.js.map +1 -0
- package/dist/purchase-options-2NUBLODI.js +145 -0
- package/dist/purchase-options-2NUBLODI.js.map +1 -0
- package/dist/{recovery-ZANX3WIQ.js → recovery-DC66ZTGD.js} +77 -18
- package/dist/recovery-DC66ZTGD.js.map +1 -0
- package/dist/{releases-GUMQZRFC.js → releases-HDCDARH5.js} +30 -3
- package/dist/releases-HDCDARH5.js.map +1 -0
- package/dist/{reports-OJSCABN6.js → reports-T6GBAYUK.js} +2 -2
- package/dist/reports-T6GBAYUK.js.map +1 -0
- package/dist/{testers-SB77565D.js → testers-NXWT2PFS.js} +2 -2
- package/dist/testers-NXWT2PFS.js.map +1 -0
- package/dist/tracks-D6FUNJ75.js +84 -0
- package/dist/tracks-D6FUNJ75.js.map +1 -0
- package/package.json +4 -4
- package/dist/apps-TZG5GEDW.js.map +0 -1
- package/dist/chunk-LQ7FJ4QA.js.map +0 -1
- package/dist/completion-3UYUJD6S.js.map +0 -1
- package/dist/iap-ZZS5NVFN.js.map +0 -1
- package/dist/listings-FYNMWTIE.js.map +0 -1
- package/dist/recovery-ZANX3WIQ.js.map +0 -1
- package/dist/releases-GUMQZRFC.js.map +0 -1
- package/dist/reports-OJSCABN6.js.map +0 -1
- package/dist/testers-SB77565D.js.map +0 -1
- package/dist/tracks-HMJ3F55N.js +0 -41
- 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
|
-
|
|
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
|
-
|
|
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-
|
|
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":[]}
|