@gpc-cli/cli 0.9.45 → 0.9.47
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +36 -15
- package/dist/anomalies-V3AFS4LD.js +66 -0
- package/dist/anomalies-V3AFS4LD.js.map +1 -0
- package/dist/{apps-J2446UDA.js → apps-FKD3ZG5X.js} +31 -35
- package/dist/apps-FKD3ZG5X.js.map +1 -0
- package/dist/{audit-N2CRHWUN.js → audit-JASSHRWN.js} +47 -62
- package/dist/audit-JASSHRWN.js.map +1 -0
- package/dist/{auth-XGSTT5G5.js → auth-OTA3SV3J.js} +145 -103
- package/dist/auth-OTA3SV3J.js.map +1 -0
- package/dist/bin.js +6 -4
- package/dist/bin.js.map +1 -1
- package/dist/bundle-F7MUVC5J.js +204 -0
- package/dist/bundle-F7MUVC5J.js.map +1 -0
- package/dist/{cache-SLNFRTI2.js → cache-XKPLZYEB.js} +4 -5
- package/dist/cache-XKPLZYEB.js.map +1 -0
- package/dist/changelog-QLDFG5TV.js +48 -0
- package/dist/changelog-QLDFG5TV.js.map +1 -0
- package/dist/{chunk-4O4D5SGL.js → chunk-3SJ6OXCZ.js} +4 -5
- package/dist/chunk-3SJ6OXCZ.js.map +1 -0
- package/dist/{chunk-U6ZTQ34I.js → chunk-BCBXQC7J.js} +45 -11
- package/dist/chunk-BCBXQC7J.js.map +1 -0
- package/dist/{chunk-AA577WVQ.js → chunk-NQH4G7BI.js} +9 -3
- package/dist/chunk-NQH4G7BI.js.map +1 -0
- package/dist/chunk-SLNJEAMK.js +23 -0
- package/dist/chunk-SLNJEAMK.js.map +1 -0
- package/dist/{chunk-SEVX56VN.js → chunk-WWVURXVO.js} +56 -49
- package/dist/chunk-WWVURXVO.js.map +1 -0
- package/dist/{chunk-NV75I5VP.js → chunk-YFUBD2XB.js} +10 -8
- package/dist/chunk-YFUBD2XB.js.map +1 -0
- package/dist/{config-BUXPDN7N.js → config-NY3TZGVS.js} +8 -5
- package/dist/config-NY3TZGVS.js.map +1 -0
- package/dist/{data-safety-Q7FTCEWU.js → data-safety-AFMD6MYI.js} +12 -27
- package/dist/data-safety-AFMD6MYI.js.map +1 -0
- package/dist/{device-tiers-MIOQEXYY.js → device-tiers-AQAMUQXI.js} +23 -38
- package/dist/device-tiers-AQAMUQXI.js.map +1 -0
- package/dist/diff-6EO4ID6W.js +91 -0
- package/dist/diff-6EO4ID6W.js.map +1 -0
- package/dist/{docs-7DUXIKA3.js → docs-4D2SJ4LY.js} +4 -3
- package/dist/docs-4D2SJ4LY.js.map +1 -0
- package/dist/doctor-QCCWG6Y3.js +708 -0
- package/dist/doctor-QCCWG6Y3.js.map +1 -0
- package/dist/{enterprise-7THXNBTC.js → enterprise-7PWXMSUN.js} +11 -21
- package/dist/enterprise-7PWXMSUN.js.map +1 -0
- package/dist/{external-transactions-2GWIMUVM.js → external-transactions-LCZALS3V.js} +12 -28
- package/dist/external-transactions-LCZALS3V.js.map +1 -0
- package/dist/{feedback-DPTO6DUT.js → feedback-CET2X67K.js} +4 -4
- package/dist/{games-BT777WUO.js → games-ZSNGEI7A.js} +17 -32
- package/dist/games-ZSNGEI7A.js.map +1 -0
- package/dist/{generated-apks-RJWTIX7L.js → generated-apks-RX2IUWSF.js} +30 -38
- package/dist/generated-apks-RX2IUWSF.js.map +1 -0
- package/dist/{grants-TKQJ3IER.js → grants-EBPECI26.js} +22 -40
- package/dist/grants-EBPECI26.js.map +1 -0
- package/dist/{iap-ICAEQLK5.js → iap-OUI5YYN4.js} +30 -51
- package/dist/iap-OUI5YYN4.js.map +1 -0
- package/dist/index.js +1 -1
- package/dist/{init-JZ2THPMS.js → init-WSTQTJOD.js} +5 -4
- package/dist/init-WSTQTJOD.js.map +1 -0
- package/dist/{install-skills-OV4HVANW.js → install-skills-6QDUXI5F.js} +5 -6
- package/dist/{install-skills-OV4HVANW.js.map → install-skills-6QDUXI5F.js.map} +1 -1
- package/dist/{internal-sharing-3U2XFHA4.js → internal-sharing-ONNIWIAT.js} +3 -4
- package/dist/{internal-sharing-3U2XFHA4.js.map → internal-sharing-ONNIWIAT.js.map} +1 -1
- package/dist/{listings-77HZW4S5.js → listings-7SGQ4SRX.js} +118 -157
- package/dist/listings-7SGQ4SRX.js.map +1 -0
- package/dist/migrate-ZQCJGQQS.js +138 -0
- package/dist/migrate-ZQCJGQQS.js.map +1 -0
- package/dist/{one-time-products-LHZAXQES.js → one-time-products-MGZTU7OM.js} +65 -120
- package/dist/one-time-products-MGZTU7OM.js.map +1 -0
- package/dist/{preflight-H3HEBYQW.js → preflight-N7ZRG2JI.js} +58 -55
- package/dist/preflight-N7ZRG2JI.js.map +1 -0
- package/dist/{pricing-XQSDTTK5.js → pricing-JJZFICFL.js} +8 -8
- package/dist/{pricing-XQSDTTK5.js.map → pricing-JJZFICFL.js.map} +1 -1
- package/dist/{prompt-BSV22CQZ.js → prompt-GXC2JSLA.js} +2 -2
- package/dist/{publish-Q5ZKEKZ5.js → publish-JPTI4EBT.js} +34 -30
- package/dist/publish-JPTI4EBT.js.map +1 -0
- package/dist/{purchase-options-CKRN4VIW.js → purchase-options-KFWW4JW2.js} +16 -11
- package/dist/purchase-options-KFWW4JW2.js.map +1 -0
- package/dist/{purchases-43AKV6HG.js → purchases-Z3QBM3UO.js} +121 -194
- package/dist/purchases-Z3QBM3UO.js.map +1 -0
- package/dist/{quickstart-4HB62YEL.js → quickstart-Z5Y3FYJU.js} +5 -3
- package/dist/quickstart-Z5Y3FYJU.js.map +1 -0
- package/dist/{quota-UHIQQYOY.js → quota-MZRWYJGR.js} +5 -15
- package/dist/quota-MZRWYJGR.js.map +1 -0
- package/dist/{recovery-5EV2R476.js → recovery-YE3Z7NIN.js} +32 -61
- package/dist/recovery-YE3Z7NIN.js.map +1 -0
- package/dist/{releases-C2WC2K4E.js → releases-276W3BR7.js} +188 -187
- package/dist/releases-276W3BR7.js.map +1 -0
- package/dist/{reports-2YX3RDOS.js → reports-CIB2T3XT.js} +19 -21
- package/dist/reports-CIB2T3XT.js.map +1 -0
- package/dist/reviews-YCBBM656.js +199 -0
- package/dist/reviews-YCBBM656.js.map +1 -0
- package/dist/rtdn-LID2B7XZ.js +87 -0
- package/dist/rtdn-LID2B7XZ.js.map +1 -0
- package/dist/{status-WHGLODGV.js → status-6LH5W4FU.js} +105 -83
- package/dist/status-6LH5W4FU.js.map +1 -0
- package/dist/{subscriptions-CI3JH3VQ.js → subscriptions-DZP3Y7O7.js} +142 -232
- package/dist/subscriptions-DZP3Y7O7.js.map +1 -0
- package/dist/{testers-NZOFA3EF.js → testers-LSMBXCA2.js} +24 -44
- package/dist/testers-LSMBXCA2.js.map +1 -0
- package/dist/tracks-YHMO2A6B.js +98 -0
- package/dist/tracks-YHMO2A6B.js.map +1 -0
- package/dist/{train-CJJVLY4B.js → train-MDD2EBHS.js} +35 -55
- package/dist/train-MDD2EBHS.js.map +1 -0
- package/dist/{update-NAK6CMUX.js → update-XAO5EZHC.js} +30 -15
- package/dist/update-XAO5EZHC.js.map +1 -0
- package/dist/{users-2YTC4Q36.js → users-UKG7VIQH.js} +45 -67
- package/dist/users-UKG7VIQH.js.map +1 -0
- package/dist/{validate-UOVTM6L3.js → validate-QIYSA3N7.js} +8 -10
- package/dist/validate-QIYSA3N7.js.map +1 -0
- package/dist/{version-N64UBW7A.js → version-R3P4NHCF.js} +4 -4
- package/dist/{vitals-A4CS4MSS.js → vitals-PJEQUUAK.js} +174 -165
- package/dist/vitals-PJEQUUAK.js.map +1 -0
- package/package.json +6 -6
- package/dist/anomalies-NU2IN2GJ.js +0 -54
- package/dist/anomalies-NU2IN2GJ.js.map +0 -1
- package/dist/apps-J2446UDA.js.map +0 -1
- package/dist/audit-N2CRHWUN.js.map +0 -1
- package/dist/auth-XGSTT5G5.js.map +0 -1
- package/dist/bundle-F43TD2BQ.js +0 -218
- package/dist/bundle-F43TD2BQ.js.map +0 -1
- package/dist/cache-SLNFRTI2.js.map +0 -1
- package/dist/changelog-ZYD6W5IV.js +0 -53
- package/dist/changelog-ZYD6W5IV.js.map +0 -1
- package/dist/chunk-4O4D5SGL.js.map +0 -1
- package/dist/chunk-AA577WVQ.js.map +0 -1
- package/dist/chunk-FWKYRLKY.js +0 -19
- package/dist/chunk-FWKYRLKY.js.map +0 -1
- package/dist/chunk-NV75I5VP.js.map +0 -1
- package/dist/chunk-SEVX56VN.js.map +0 -1
- package/dist/chunk-U6ZTQ34I.js.map +0 -1
- package/dist/config-BUXPDN7N.js.map +0 -1
- package/dist/data-safety-Q7FTCEWU.js.map +0 -1
- package/dist/device-tiers-MIOQEXYY.js.map +0 -1
- package/dist/diff-V77SMKAQ.js +0 -96
- package/dist/diff-V77SMKAQ.js.map +0 -1
- package/dist/docs-7DUXIKA3.js.map +0 -1
- package/dist/doctor-3Z4ARPM2.js +0 -372
- package/dist/doctor-3Z4ARPM2.js.map +0 -1
- package/dist/enterprise-7THXNBTC.js.map +0 -1
- package/dist/external-transactions-2GWIMUVM.js.map +0 -1
- package/dist/games-BT777WUO.js.map +0 -1
- package/dist/generated-apks-RJWTIX7L.js.map +0 -1
- package/dist/grants-TKQJ3IER.js.map +0 -1
- package/dist/iap-ICAEQLK5.js.map +0 -1
- package/dist/init-JZ2THPMS.js.map +0 -1
- package/dist/listings-77HZW4S5.js.map +0 -1
- package/dist/migrate-SQT6RD6T.js +0 -143
- package/dist/migrate-SQT6RD6T.js.map +0 -1
- package/dist/one-time-products-LHZAXQES.js.map +0 -1
- package/dist/preflight-H3HEBYQW.js.map +0 -1
- package/dist/publish-Q5ZKEKZ5.js.map +0 -1
- package/dist/purchase-options-CKRN4VIW.js.map +0 -1
- package/dist/purchases-43AKV6HG.js.map +0 -1
- package/dist/quickstart-4HB62YEL.js.map +0 -1
- package/dist/quota-UHIQQYOY.js.map +0 -1
- package/dist/recovery-5EV2R476.js.map +0 -1
- package/dist/releases-C2WC2K4E.js.map +0 -1
- package/dist/reports-2YX3RDOS.js.map +0 -1
- package/dist/reviews-2CWOI5CV.js +0 -213
- package/dist/reviews-2CWOI5CV.js.map +0 -1
- package/dist/status-WHGLODGV.js.map +0 -1
- package/dist/subscriptions-CI3JH3VQ.js.map +0 -1
- package/dist/testers-NZOFA3EF.js.map +0 -1
- package/dist/tracks-NERFFEDT.js +0 -107
- package/dist/tracks-NERFFEDT.js.map +0 -1
- package/dist/train-CJJVLY4B.js.map +0 -1
- package/dist/update-NAK6CMUX.js.map +0 -1
- package/dist/users-2YTC4Q36.js.map +0 -1
- package/dist/validate-UOVTM6L3.js.map +0 -1
- package/dist/vitals-A4CS4MSS.js.map +0 -1
- /package/dist/{feedback-DPTO6DUT.js.map → feedback-CET2X67K.js.map} +0 -0
- /package/dist/{prompt-BSV22CQZ.js.map → prompt-GXC2JSLA.js.map} +0 -0
- /package/dist/{version-N64UBW7A.js.map → version-R3P4NHCF.js.map} +0 -0
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
readJsonFile
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-SLNJEAMK.js";
|
|
5
5
|
import {
|
|
6
6
|
getClient,
|
|
7
7
|
resolvePackageName
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-NQH4G7BI.js";
|
|
9
9
|
import {
|
|
10
10
|
isDryRun,
|
|
11
11
|
printDryRun
|
|
@@ -15,7 +15,7 @@ import {
|
|
|
15
15
|
} from "./chunk-ELXAK7GI.js";
|
|
16
16
|
import {
|
|
17
17
|
requireConfirm
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-YFUBD2XB.js";
|
|
19
19
|
|
|
20
20
|
// src/commands/subscriptions.ts
|
|
21
21
|
import { Option } from "commander";
|
|
@@ -49,35 +49,30 @@ function registerSubscriptionsCommands(program) {
|
|
|
49
49
|
const packageName = resolvePackageName(program.opts()["app"], config);
|
|
50
50
|
const client = await getClient(config);
|
|
51
51
|
const format = getOutputFormat(program, config);
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
if (
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
return;
|
|
67
|
-
}
|
|
68
|
-
const summary = subs2.map((s) => ({
|
|
69
|
-
productId: s.productId,
|
|
70
|
-
basePlans: s.basePlans?.length || 0,
|
|
71
|
-
listings: s.listings ? Object.keys(s.listings).length : 0,
|
|
72
|
-
firstBasePlanState: s.basePlans?.[0]?.state || "-"
|
|
73
|
-
}));
|
|
74
|
-
console.log(formatOutput(summary, format));
|
|
75
|
-
} else {
|
|
76
|
-
console.log(formatOutput(subs2.length === 0 ? { subscriptions: [] } : result, format));
|
|
52
|
+
const result = await listSubscriptions(client, packageName, {
|
|
53
|
+
pageSize: options.pageSize,
|
|
54
|
+
pageToken: options.pageToken,
|
|
55
|
+
limit: options.limit,
|
|
56
|
+
nextPage: options.nextPage
|
|
57
|
+
});
|
|
58
|
+
if (options.sort) {
|
|
59
|
+
result.subscriptions = sortResults(result.subscriptions, options.sort);
|
|
60
|
+
}
|
|
61
|
+
const subs2 = result.subscriptions || [];
|
|
62
|
+
if (format !== "json") {
|
|
63
|
+
if (subs2.length === 0) {
|
|
64
|
+
console.log("No subscriptions found.");
|
|
65
|
+
return;
|
|
77
66
|
}
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
67
|
+
const summary = subs2.map((s) => ({
|
|
68
|
+
productId: s.productId,
|
|
69
|
+
basePlans: s.basePlans?.length || 0,
|
|
70
|
+
listings: s.listings ? Object.keys(s.listings).length : 0,
|
|
71
|
+
firstBasePlanState: s.basePlans?.[0]?.state || "-"
|
|
72
|
+
}));
|
|
73
|
+
console.log(formatOutput(summary, format));
|
|
74
|
+
} else {
|
|
75
|
+
console.log(formatOutput(subs2.length === 0 ? { subscriptions: [] } : result, format));
|
|
81
76
|
}
|
|
82
77
|
});
|
|
83
78
|
subs.command("get <product-id>").description("Get a subscription").action(async (productId) => {
|
|
@@ -85,29 +80,24 @@ function registerSubscriptionsCommands(program) {
|
|
|
85
80
|
const packageName = resolvePackageName(program.opts()["app"], config);
|
|
86
81
|
const client = await getClient(config);
|
|
87
82
|
const format = getOutputFormat(program, config);
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
console.log(formatOutput(result, format));
|
|
107
|
-
}
|
|
108
|
-
} catch (error) {
|
|
109
|
-
console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);
|
|
110
|
-
process.exit(4);
|
|
83
|
+
const result = await getSubscription(client, packageName, productId);
|
|
84
|
+
if (format !== "json") {
|
|
85
|
+
const s = result;
|
|
86
|
+
const basePlans2 = s["basePlans"];
|
|
87
|
+
const listings = s["listings"];
|
|
88
|
+
const listingLanguages = listings ? Array.isArray(listings) ? listings.map((l) => l["languageCode"] || l["language"] || "?").join(", ") : Object.keys(listings).join(", ") : "-";
|
|
89
|
+
const listingCount = listings ? Array.isArray(listings) ? listings.length : Object.keys(listings).length : 0;
|
|
90
|
+
const summary = {
|
|
91
|
+
productId: s["productId"],
|
|
92
|
+
basePlans: basePlans2?.length || 0,
|
|
93
|
+
basePlanIds: basePlans2?.map((bp) => bp["basePlanId"]).join(", ") || "-",
|
|
94
|
+
listings: listingCount,
|
|
95
|
+
listingLanguages,
|
|
96
|
+
taxCategory: s["taxAndComplianceSettings"]?.["taxRateInfoByRegionCode"] ? "configured" : "-"
|
|
97
|
+
};
|
|
98
|
+
console.log(formatOutput(summary, format));
|
|
99
|
+
} else {
|
|
100
|
+
console.log(formatOutput(result, format));
|
|
111
101
|
}
|
|
112
102
|
});
|
|
113
103
|
subs.command("create").description("Create a subscription from JSON file").requiredOption("--file <path>", "JSON file with subscription data").option("--activate", "Activate all base plans after creation").action(async (options) => {
|
|
@@ -128,24 +118,19 @@ function registerSubscriptionsCommands(program) {
|
|
|
128
118
|
return;
|
|
129
119
|
}
|
|
130
120
|
const client = await getClient(config);
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
console.error(`Activated base plan: ${bp.basePlanId}`);
|
|
139
|
-
}
|
|
121
|
+
const data = await readJsonFile(options.file);
|
|
122
|
+
const result = await createSubscription(client, packageName, data);
|
|
123
|
+
if (options.activate && result.basePlans) {
|
|
124
|
+
for (const bp of result.basePlans) {
|
|
125
|
+
if (bp.state === "DRAFT") {
|
|
126
|
+
await activateBasePlan(client, packageName, result.productId, bp.basePlanId);
|
|
127
|
+
console.error(`Activated base plan: ${bp.basePlanId}`);
|
|
140
128
|
}
|
|
141
|
-
const updated = await getSubscription(client, packageName, result.productId);
|
|
142
|
-
console.log(formatOutput(updated, format));
|
|
143
|
-
} else {
|
|
144
|
-
console.log(formatOutput(result, format));
|
|
145
129
|
}
|
|
146
|
-
|
|
147
|
-
console.
|
|
148
|
-
|
|
130
|
+
const updated = await getSubscription(client, packageName, result.productId);
|
|
131
|
+
console.log(formatOutput(updated, format));
|
|
132
|
+
} else {
|
|
133
|
+
console.log(formatOutput(result, format));
|
|
149
134
|
}
|
|
150
135
|
});
|
|
151
136
|
subs.command("update <product-id>").description("Update a subscription from JSON file").requiredOption("--file <path>", "JSON file with subscription data").option("--update-mask <fields>", "Comma-separated field mask").action(async (productId, options) => {
|
|
@@ -166,20 +151,15 @@ function registerSubscriptionsCommands(program) {
|
|
|
166
151
|
return;
|
|
167
152
|
}
|
|
168
153
|
const client = await getClient(config);
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
console.log(formatOutput(result, format));
|
|
179
|
-
} catch (error) {
|
|
180
|
-
console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);
|
|
181
|
-
process.exit(4);
|
|
182
|
-
}
|
|
154
|
+
const data = await readJsonFile(options.file);
|
|
155
|
+
const result = await updateSubscription(
|
|
156
|
+
client,
|
|
157
|
+
packageName,
|
|
158
|
+
productId,
|
|
159
|
+
data,
|
|
160
|
+
options.updateMask
|
|
161
|
+
);
|
|
162
|
+
console.log(formatOutput(result, format));
|
|
183
163
|
});
|
|
184
164
|
subs.command("delete <product-id>").description("Delete a subscription").action(async (productId) => {
|
|
185
165
|
const config = await loadConfig();
|
|
@@ -199,13 +179,8 @@ function registerSubscriptionsCommands(program) {
|
|
|
199
179
|
return;
|
|
200
180
|
}
|
|
201
181
|
const client = await getClient(config);
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
console.log(`Subscription ${productId} deleted.`);
|
|
205
|
-
} catch (error) {
|
|
206
|
-
console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);
|
|
207
|
-
process.exit(4);
|
|
208
|
-
}
|
|
182
|
+
await deleteSubscription(client, packageName, productId);
|
|
183
|
+
console.log(`Subscription ${productId} deleted.`);
|
|
209
184
|
});
|
|
210
185
|
const basePlans = subs.command("base-plans").description("Manage base plans");
|
|
211
186
|
basePlans.command("activate <product-id> <base-plan-id>").description("Activate a base plan").action(async (productId, basePlanId) => {
|
|
@@ -225,13 +200,8 @@ function registerSubscriptionsCommands(program) {
|
|
|
225
200
|
return;
|
|
226
201
|
}
|
|
227
202
|
const client = await getClient(config);
|
|
228
|
-
|
|
229
|
-
|
|
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
|
-
}
|
|
203
|
+
const result = await activateBasePlan(client, packageName, productId, basePlanId);
|
|
204
|
+
console.log(formatOutput(result, format));
|
|
235
205
|
});
|
|
236
206
|
basePlans.command("deactivate <product-id> <base-plan-id>").description("Deactivate a base plan").action(async (productId, basePlanId) => {
|
|
237
207
|
const config = await loadConfig();
|
|
@@ -250,13 +220,8 @@ function registerSubscriptionsCommands(program) {
|
|
|
250
220
|
return;
|
|
251
221
|
}
|
|
252
222
|
const client = await getClient(config);
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
console.log(formatOutput(result, format));
|
|
256
|
-
} catch (error) {
|
|
257
|
-
console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);
|
|
258
|
-
process.exit(4);
|
|
259
|
-
}
|
|
223
|
+
const result = await deactivateBasePlan(client, packageName, productId, basePlanId);
|
|
224
|
+
console.log(formatOutput(result, format));
|
|
260
225
|
});
|
|
261
226
|
basePlans.command("delete <product-id> <base-plan-id>").description("Delete a base plan").action(async (productId, basePlanId) => {
|
|
262
227
|
const config = await loadConfig();
|
|
@@ -279,13 +244,8 @@ function registerSubscriptionsCommands(program) {
|
|
|
279
244
|
return;
|
|
280
245
|
}
|
|
281
246
|
const client = await getClient(config);
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
console.log(`Base plan ${basePlanId} deleted.`);
|
|
285
|
-
} catch (error) {
|
|
286
|
-
console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);
|
|
287
|
-
process.exit(4);
|
|
288
|
-
}
|
|
247
|
+
await deleteBasePlan(client, packageName, productId, basePlanId);
|
|
248
|
+
console.log(`Base plan ${basePlanId} deleted.`);
|
|
289
249
|
});
|
|
290
250
|
basePlans.command("migrate-prices <product-id> <base-plan-id>").description("Migrate base plan prices").requiredOption("--file <path>", "JSON file with migration data").action(
|
|
291
251
|
async (productId, basePlanId, options) => {
|
|
@@ -306,20 +266,15 @@ function registerSubscriptionsCommands(program) {
|
|
|
306
266
|
return;
|
|
307
267
|
}
|
|
308
268
|
const client = await getClient(config);
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
console.log(formatOutput(result, format));
|
|
319
|
-
} catch (error) {
|
|
320
|
-
console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);
|
|
321
|
-
process.exit(4);
|
|
322
|
-
}
|
|
269
|
+
const data = await readJsonFile(options.file);
|
|
270
|
+
const result = await migratePrices(
|
|
271
|
+
client,
|
|
272
|
+
packageName,
|
|
273
|
+
productId,
|
|
274
|
+
basePlanId,
|
|
275
|
+
data
|
|
276
|
+
);
|
|
277
|
+
console.log(formatOutput(result, format));
|
|
323
278
|
}
|
|
324
279
|
);
|
|
325
280
|
const offers = subs.command("offers").description("Manage subscription offers");
|
|
@@ -328,28 +283,23 @@ function registerSubscriptionsCommands(program) {
|
|
|
328
283
|
const packageName = resolvePackageName(program.opts()["app"], config);
|
|
329
284
|
const client = await getClient(config);
|
|
330
285
|
const format = getOutputFormat(program, config);
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
if (
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
return;
|
|
338
|
-
}
|
|
339
|
-
const summary = offers_list.map((o) => ({
|
|
340
|
-
offerId: o["offerId"],
|
|
341
|
-
basePlanId: o["basePlanId"],
|
|
342
|
-
state: o["state"] || "-",
|
|
343
|
-
phases: o["phases"]?.length || 0,
|
|
344
|
-
regionalConfigs: o["regionalConfigs"]?.length || 0
|
|
345
|
-
}));
|
|
346
|
-
console.log(formatOutput(summary, format));
|
|
347
|
-
} else {
|
|
348
|
-
console.log(formatOutput(result, format));
|
|
286
|
+
const result = await listOffers(client, packageName, productId, basePlanId);
|
|
287
|
+
const offers_list = result["subscriptionOffers"];
|
|
288
|
+
if (format !== "json") {
|
|
289
|
+
if (!offers_list || offers_list.length === 0) {
|
|
290
|
+
console.log("No offers found.");
|
|
291
|
+
return;
|
|
349
292
|
}
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
293
|
+
const summary = offers_list.map((o) => ({
|
|
294
|
+
offerId: o["offerId"],
|
|
295
|
+
basePlanId: o["basePlanId"],
|
|
296
|
+
state: o["state"] || "-",
|
|
297
|
+
phases: o["phases"]?.length || 0,
|
|
298
|
+
regionalConfigs: o["regionalConfigs"]?.length || 0
|
|
299
|
+
}));
|
|
300
|
+
console.log(formatOutput(summary, format));
|
|
301
|
+
} else {
|
|
302
|
+
console.log(formatOutput(result, format));
|
|
353
303
|
}
|
|
354
304
|
});
|
|
355
305
|
offers.command("get <product-id> <base-plan-id> <offer-id>").description("Get an offer").action(async (productId, basePlanId, offerId) => {
|
|
@@ -357,13 +307,8 @@ function registerSubscriptionsCommands(program) {
|
|
|
357
307
|
const packageName = resolvePackageName(program.opts()["app"], config);
|
|
358
308
|
const client = await getClient(config);
|
|
359
309
|
const format = getOutputFormat(program, config);
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
console.log(formatOutput(result, format));
|
|
363
|
-
} catch (error) {
|
|
364
|
-
console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);
|
|
365
|
-
process.exit(4);
|
|
366
|
-
}
|
|
310
|
+
const result = await getOffer(client, packageName, productId, basePlanId, offerId);
|
|
311
|
+
console.log(formatOutput(result, format));
|
|
367
312
|
});
|
|
368
313
|
offers.command("create <product-id> <base-plan-id>").description("Create an offer from JSON file").requiredOption("--file <path>", "JSON file with offer data").action(
|
|
369
314
|
async (productId, basePlanId, options) => {
|
|
@@ -384,14 +329,9 @@ function registerSubscriptionsCommands(program) {
|
|
|
384
329
|
return;
|
|
385
330
|
}
|
|
386
331
|
const client = await getClient(config);
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
console.log(formatOutput(result, format));
|
|
391
|
-
} catch (error) {
|
|
392
|
-
console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);
|
|
393
|
-
process.exit(4);
|
|
394
|
-
}
|
|
332
|
+
const data = await readJsonFile(options.file);
|
|
333
|
+
const result = await createOffer(client, packageName, productId, basePlanId, data);
|
|
334
|
+
console.log(formatOutput(result, format));
|
|
395
335
|
}
|
|
396
336
|
);
|
|
397
337
|
offers.command("update <product-id> <base-plan-id> <offer-id>").description("Update an offer from JSON file").requiredOption("--file <path>", "JSON file with offer data").option("--update-mask <fields>", "Comma-separated field mask").action(
|
|
@@ -413,22 +353,17 @@ function registerSubscriptionsCommands(program) {
|
|
|
413
353
|
return;
|
|
414
354
|
}
|
|
415
355
|
const client = await getClient(config);
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
console.log(formatOutput(result, format));
|
|
428
|
-
} catch (error) {
|
|
429
|
-
console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);
|
|
430
|
-
process.exit(4);
|
|
431
|
-
}
|
|
356
|
+
const data = await readJsonFile(options.file);
|
|
357
|
+
const result = await updateOffer(
|
|
358
|
+
client,
|
|
359
|
+
packageName,
|
|
360
|
+
productId,
|
|
361
|
+
basePlanId,
|
|
362
|
+
offerId,
|
|
363
|
+
data,
|
|
364
|
+
options.updateMask
|
|
365
|
+
);
|
|
366
|
+
console.log(formatOutput(result, format));
|
|
432
367
|
}
|
|
433
368
|
);
|
|
434
369
|
offers.command("delete <product-id> <base-plan-id> <offer-id>").description("Delete an offer").action(async (productId, basePlanId, offerId) => {
|
|
@@ -449,13 +384,8 @@ function registerSubscriptionsCommands(program) {
|
|
|
449
384
|
return;
|
|
450
385
|
}
|
|
451
386
|
const client = await getClient(config);
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
console.log(`Offer ${offerId} deleted.`);
|
|
455
|
-
} catch (error) {
|
|
456
|
-
console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);
|
|
457
|
-
process.exit(4);
|
|
458
|
-
}
|
|
387
|
+
await deleteOffer(client, packageName, productId, basePlanId, offerId);
|
|
388
|
+
console.log(`Offer ${offerId} deleted.`);
|
|
459
389
|
});
|
|
460
390
|
offers.command("activate <product-id> <base-plan-id> <offer-id>").description("Activate an offer").action(async (productId, basePlanId, offerId) => {
|
|
461
391
|
const config = await loadConfig();
|
|
@@ -474,13 +404,8 @@ function registerSubscriptionsCommands(program) {
|
|
|
474
404
|
return;
|
|
475
405
|
}
|
|
476
406
|
const client = await getClient(config);
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
console.log(formatOutput(result, format));
|
|
480
|
-
} catch (error) {
|
|
481
|
-
console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);
|
|
482
|
-
process.exit(4);
|
|
483
|
-
}
|
|
407
|
+
const result = await activateOffer(client, packageName, productId, basePlanId, offerId);
|
|
408
|
+
console.log(formatOutput(result, format));
|
|
484
409
|
});
|
|
485
410
|
offers.command("deactivate <product-id> <base-plan-id> <offer-id>").description("Deactivate an offer").action(async (productId, basePlanId, offerId) => {
|
|
486
411
|
const config = await loadConfig();
|
|
@@ -499,30 +424,20 @@ function registerSubscriptionsCommands(program) {
|
|
|
499
424
|
return;
|
|
500
425
|
}
|
|
501
426
|
const client = await getClient(config);
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
console.log(formatOutput(result, format));
|
|
505
|
-
} catch (error) {
|
|
506
|
-
console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);
|
|
507
|
-
process.exit(4);
|
|
508
|
-
}
|
|
427
|
+
const result = await deactivateOffer(client, packageName, productId, basePlanId, offerId);
|
|
428
|
+
console.log(formatOutput(result, format));
|
|
509
429
|
});
|
|
510
430
|
subs.command("diff <product-id>").description("Compare local JSON file against remote subscription").requiredOption("--file <path>", "Local JSON file to compare against remote").action(async (productId, options) => {
|
|
511
431
|
const config = await loadConfig();
|
|
512
432
|
const packageName = resolvePackageName(program.opts()["app"], config);
|
|
513
433
|
const client = await getClient(config);
|
|
514
434
|
const format = getOutputFormat(program, config);
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
console.log(formatOutput(diffs, format));
|
|
522
|
-
}
|
|
523
|
-
} catch (error) {
|
|
524
|
-
console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);
|
|
525
|
-
process.exit(4);
|
|
435
|
+
const localData = await readJsonFile(options.file);
|
|
436
|
+
const diffs = await diffSubscription(client, packageName, productId, localData);
|
|
437
|
+
if (diffs.length === 0) {
|
|
438
|
+
console.log("No differences found.");
|
|
439
|
+
} else {
|
|
440
|
+
console.log(formatOutput(diffs, format));
|
|
526
441
|
}
|
|
527
442
|
});
|
|
528
443
|
subs.command("analytics").description("Subscription catalog analytics: active plans, offer counts, state breakdown").action(async () => {
|
|
@@ -530,33 +445,28 @@ function registerSubscriptionsCommands(program) {
|
|
|
530
445
|
const packageName = resolvePackageName(program.opts()["app"], config);
|
|
531
446
|
const client = await getClient(config);
|
|
532
447
|
const format = getOutputFormat(program, config);
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
console.log(`
|
|
448
|
+
const result = await getSubscriptionAnalytics(client, packageName);
|
|
449
|
+
if (format === "json") {
|
|
450
|
+
console.log(formatOutput(result, format));
|
|
451
|
+
return;
|
|
452
|
+
}
|
|
453
|
+
console.log(`
|
|
540
454
|
Subscription Analytics \u2014 ${packageName}`);
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
455
|
+
console.log(`${"\u2500".repeat(50)}`);
|
|
456
|
+
console.log(`Total subscriptions: ${result.totalSubscriptions}`);
|
|
457
|
+
console.log(`Active subscriptions: ${result.activeCount}`);
|
|
458
|
+
console.log(`Active base plans: ${result.activeBasePlans}`);
|
|
459
|
+
console.log(`Draft base plans: ${result.trialBasePlans}`);
|
|
460
|
+
console.log(`Inactive base plans: ${result.pausedBasePlans}`);
|
|
461
|
+
console.log(`Total offers: ${result.offerCount}`);
|
|
462
|
+
if (result.byProductId.length > 0) {
|
|
463
|
+
console.log(`
|
|
550
464
|
By product:`);
|
|
551
|
-
|
|
552
|
-
}
|
|
553
|
-
} catch (error) {
|
|
554
|
-
console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);
|
|
555
|
-
process.exit(4);
|
|
465
|
+
console.log(formatOutput(result.byProductId, format));
|
|
556
466
|
}
|
|
557
467
|
});
|
|
558
468
|
}
|
|
559
469
|
export {
|
|
560
470
|
registerSubscriptionsCommands
|
|
561
471
|
};
|
|
562
|
-
//# sourceMappingURL=subscriptions-
|
|
472
|
+
//# sourceMappingURL=subscriptions-DZP3Y7O7.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/subscriptions.ts"],"sourcesContent":["import { resolvePackageName, getClient } from \"../resolve.js\";\nimport type { Command } from \"commander\";\nimport { Option } from \"commander\";\nimport { loadConfig } from \"@gpc-cli/config\";\n\nimport type { Subscription } from \"@gpc-cli/api\";\nimport {\n listSubscriptions,\n getSubscription,\n createSubscription,\n updateSubscription,\n deleteSubscription,\n activateBasePlan,\n deactivateBasePlan,\n deleteBasePlan,\n migratePrices,\n listOffers,\n getOffer,\n createOffer,\n updateOffer,\n deleteOffer,\n activateOffer,\n deactivateOffer,\n diffSubscription,\n getSubscriptionAnalytics,\n formatOutput,\n sortResults,\n} from \"@gpc-cli/core\";\nimport { getOutputFormat } from \"../format.js\";\nimport { isDryRun, printDryRun } from \"../dry-run.js\";\nimport { requireConfirm } from \"../prompt.js\";\nimport { readJsonFile } from \"../json.js\";\n\n\n\nexport function registerSubscriptionsCommands(program: Command): void {\n const subs = program.command(\"subscriptions\").description(\"Manage subscriptions and base plans\");\n\n subs\n .command(\"list\")\n .description(\"List subscriptions\")\n .addOption(new Option(\"--page-size <n>\", \"Results per page\").argParser(parseInt).hideHelp())\n .addOption(new Option(\"--page-token <token>\", \"Page token\").hideHelp())\n .option(\"--limit <n>\", \"Maximum total results\", parseInt)\n .option(\"--next-page <token>\", \"Resume from page token\")\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 = getOutputFormat(program, config);\n\n const result = await listSubscriptions(client, packageName, {\n pageSize: options.pageSize,\n pageToken: options.pageToken,\n limit: options.limit,\n nextPage: options.nextPage,\n });\n if (options.sort) {\n result.subscriptions = sortResults(result.subscriptions, options.sort);\n }\n const subs = result.subscriptions || [];\n if (format !== \"json\") {\n if (subs.length === 0) {\n console.log(\"No subscriptions found.\");\n return;\n }\n const summary = subs.map((s: Subscription) => ({\n productId: s.productId,\n basePlans: s.basePlans?.length || 0,\n listings: s.listings ? Object.keys(s.listings).length : 0,\n firstBasePlanState: s.basePlans?.[0]?.state || \"-\",\n }));\n console.log(formatOutput(summary, format));\n } else {\n console.log(formatOutput(subs.length === 0 ? { subscriptions: [] } : result, format));\n }\n });\n\n subs\n .command(\"get <product-id>\")\n .description(\"Get a subscription\")\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 = getOutputFormat(program, config);\n\n const result = await getSubscription(client, packageName, productId);\n if (format !== \"json\") {\n const s = result as unknown as Record<string, unknown>;\n const basePlans = s[\"basePlans\"] as Array<Record<string, unknown>> | undefined;\n const listings = s[\"listings\"] as\n | Record<string, unknown>\n | Array<Record<string, unknown>>\n | undefined;\n const listingLanguages = listings\n ? Array.isArray(listings)\n ? listings.map((l) => l[\"languageCode\"] || l[\"language\"] || \"?\").join(\", \")\n : Object.keys(listings).join(\", \")\n : \"-\";\n const listingCount = listings\n ? Array.isArray(listings)\n ? listings.length\n : Object.keys(listings).length\n : 0;\n const summary = {\n productId: s[\"productId\"],\n basePlans: basePlans?.length || 0,\n basePlanIds: basePlans?.map((bp) => bp[\"basePlanId\"]).join(\", \") || \"-\",\n listings: listingCount,\n listingLanguages,\n taxCategory: (s[\"taxAndComplianceSettings\"] as Record<string, unknown>)?.[\n \"taxRateInfoByRegionCode\"\n ]\n ? \"configured\"\n : \"-\",\n };\n console.log(formatOutput(summary, format));\n } else {\n console.log(formatOutput(result, format));\n }\n });\n\n subs\n .command(\"create\")\n .description(\"Create a subscription from JSON file\")\n .requiredOption(\"--file <path>\", \"JSON file with subscription data\")\n .option(\"--activate\", \"Activate all base plans after creation\")\n .action(async (options) => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n const format = getOutputFormat(program, config);\n\n if (isDryRun(program)) {\n printDryRun(\n {\n command: \"subscriptions create\",\n action: \"create\",\n target: `subscription from ${options.file}`,\n details: options.activate ? { activate: true } : undefined,\n },\n format,\n formatOutput,\n );\n return;\n }\n\n const client = await getClient(config);\n\n const data = await readJsonFile(options.file);\n const result = await createSubscription(client, packageName, data as any);\n\n if (options.activate && result.basePlans) {\n for (const bp of result.basePlans) {\n if (bp.state === \"DRAFT\") {\n await activateBasePlan(client, packageName, result.productId, bp.basePlanId);\n console.error(`Activated base plan: ${bp.basePlanId}`);\n }\n }\n // Re-fetch to get updated state\n const updated = await getSubscription(client, packageName, result.productId);\n console.log(formatOutput(updated, format));\n } else {\n console.log(formatOutput(result, format));\n }\n });\n\n subs\n .command(\"update <product-id>\")\n .description(\"Update a subscription from JSON file\")\n .requiredOption(\"--file <path>\", \"JSON file with subscription data\")\n .option(\"--update-mask <fields>\", \"Comma-separated field mask\")\n .action(async (productId: string, options) => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n const format = getOutputFormat(program, config);\n\n if (isDryRun(program)) {\n printDryRun(\n {\n command: \"subscriptions update\",\n action: \"update\",\n target: productId,\n details: { file: options.file, updateMask: options.updateMask },\n },\n format,\n formatOutput,\n );\n return;\n }\n\n const client = await getClient(config);\n\n const data = await readJsonFile(options.file);\n const result = await updateSubscription(\n client,\n packageName,\n productId,\n data as any,\n options.updateMask,\n );\n console.log(formatOutput(result, format));\n });\n\n subs\n .command(\"delete <product-id>\")\n .description(\"Delete a subscription\")\n .action(async (productId: string) => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n\n await requireConfirm(`Delete subscription \"${productId}\"?`, program);\n\n if (isDryRun(program)) {\n const format = getOutputFormat(program, config);\n printDryRun(\n {\n command: \"subscriptions 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 await deleteSubscription(client, packageName, productId);\n console.log(`Subscription ${productId} deleted.`);\n });\n\n // --- Base Plans ---\n const basePlans = subs.command(\"base-plans\").description(\"Manage base plans\");\n\n basePlans\n .command(\"activate <product-id> <base-plan-id>\")\n .description(\"Activate a base plan\")\n .action(async (productId: string, basePlanId: string) => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n const format = getOutputFormat(program, config);\n\n if (isDryRun(program)) {\n printDryRun(\n {\n command: \"subscriptions base-plans activate\",\n action: \"activate\",\n target: `${productId}/${basePlanId}`,\n },\n format,\n formatOutput,\n );\n return;\n }\n\n const client = await getClient(config);\n\n const result = await activateBasePlan(client, packageName, productId, basePlanId);\n console.log(formatOutput(result, format));\n });\n\n basePlans\n .command(\"deactivate <product-id> <base-plan-id>\")\n .description(\"Deactivate a base plan\")\n .action(async (productId: string, basePlanId: string) => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n const format = getOutputFormat(program, config);\n\n if (isDryRun(program)) {\n printDryRun(\n {\n command: \"subscriptions base-plans deactivate\",\n action: \"deactivate\",\n target: `${productId}/${basePlanId}`,\n },\n format,\n formatOutput,\n );\n return;\n }\n\n const client = await getClient(config);\n\n const result = await deactivateBasePlan(client, packageName, productId, basePlanId);\n console.log(formatOutput(result, format));\n });\n\n basePlans\n .command(\"delete <product-id> <base-plan-id>\")\n .description(\"Delete a base plan\")\n .action(async (productId: string, basePlanId: string) => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n\n await requireConfirm(\n `Delete base plan \"${basePlanId}\" from subscription \"${productId}\"?`,\n program,\n );\n\n if (isDryRun(program)) {\n const format = getOutputFormat(program, config);\n printDryRun(\n {\n command: \"subscriptions base-plans delete\",\n action: \"delete\",\n target: `${productId}/${basePlanId}`,\n },\n format,\n formatOutput,\n );\n return;\n }\n\n const client = await getClient(config);\n\n await deleteBasePlan(client, packageName, productId, basePlanId);\n console.log(`Base plan ${basePlanId} deleted.`);\n });\n\n basePlans\n .command(\"migrate-prices <product-id> <base-plan-id>\")\n .description(\"Migrate base plan prices\")\n .requiredOption(\"--file <path>\", \"JSON file with migration data\")\n .action(\n async (\n productId: string,\n basePlanId: string,\n options: { file: string; updateMask?: string },\n ) => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n const format = getOutputFormat(program, config);\n\n if (isDryRun(program)) {\n printDryRun(\n {\n command: \"subscriptions base-plans migrate-prices\",\n action: \"migrate prices for\",\n target: `${productId}/${basePlanId}`,\n details: { file: options.file },\n },\n format,\n formatOutput,\n );\n return;\n }\n\n const client = await getClient(config);\n\n const data = await readJsonFile(options.file);\n const result = await migratePrices(\n client,\n packageName,\n productId,\n basePlanId,\n data as any,\n );\n console.log(formatOutput(result, format));\n },\n );\n\n // --- Offers ---\n const offers = subs.command(\"offers\").description(\"Manage subscription offers\");\n\n offers\n .command(\"list <product-id> <base-plan-id>\")\n .description(\"List offers for a base plan\")\n .action(async (productId: string, basePlanId: string) => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n const client = await getClient(config);\n const format = getOutputFormat(program, config);\n\n const result = await listOffers(client, packageName, productId, basePlanId);\n const offers_list = (result as unknown as Record<string, unknown>)[\"subscriptionOffers\"] as\n | Array<Record<string, unknown>>\n | undefined;\n if (format !== \"json\") {\n if (!offers_list || offers_list.length === 0) {\n console.log(\"No offers found.\");\n return;\n }\n const summary = offers_list.map((o) => ({\n offerId: o[\"offerId\"],\n basePlanId: o[\"basePlanId\"],\n state: o[\"state\"] || \"-\",\n phases: (o[\"phases\"] as unknown[])?.length || 0,\n regionalConfigs: (o[\"regionalConfigs\"] as unknown[])?.length || 0,\n }));\n console.log(formatOutput(summary, format));\n } else {\n console.log(formatOutput(result, format));\n }\n });\n\n offers\n .command(\"get <product-id> <base-plan-id> <offer-id>\")\n .description(\"Get an offer\")\n .action(async (productId: string, basePlanId: 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 = getOutputFormat(program, config);\n\n const result = await getOffer(client, packageName, productId, basePlanId, offerId);\n console.log(formatOutput(result, format));\n });\n\n offers\n .command(\"create <product-id> <base-plan-id>\")\n .description(\"Create an offer from JSON file\")\n .requiredOption(\"--file <path>\", \"JSON file with offer data\")\n .action(\n async (\n productId: string,\n basePlanId: string,\n options: { file: string; updateMask?: string },\n ) => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n const format = getOutputFormat(program, config);\n\n if (isDryRun(program)) {\n printDryRun(\n {\n command: \"subscriptions offers create\",\n action: \"create offer for\",\n target: `${productId}/${basePlanId}`,\n details: { file: options.file },\n },\n format,\n formatOutput,\n );\n return;\n }\n\n const client = await getClient(config);\n\n const data = await readJsonFile(options.file);\n const result = await createOffer(client, packageName, productId, basePlanId, data as any);\n console.log(formatOutput(result, format));\n },\n );\n\n offers\n .command(\"update <product-id> <base-plan-id> <offer-id>\")\n .description(\"Update an offer from JSON file\")\n .requiredOption(\"--file <path>\", \"JSON file with offer data\")\n .option(\"--update-mask <fields>\", \"Comma-separated field mask\")\n .action(\n async (\n productId: string,\n basePlanId: string,\n offerId: string,\n options: { file: string; updateMask?: string },\n ) => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n const format = getOutputFormat(program, config);\n\n if (isDryRun(program)) {\n printDryRun(\n {\n command: \"subscriptions offers update\",\n action: \"update offer\",\n target: `${productId}/${basePlanId}/${offerId}`,\n details: { file: options.file, updateMask: options.updateMask },\n },\n format,\n formatOutput,\n );\n return;\n }\n\n const client = await getClient(config);\n\n const data = await readJsonFile(options.file);\n const result = await updateOffer(\n client,\n packageName,\n productId,\n basePlanId,\n offerId,\n data as any,\n options.updateMask,\n );\n console.log(formatOutput(result, format));\n },\n );\n\n offers\n .command(\"delete <product-id> <base-plan-id> <offer-id>\")\n .description(\"Delete an offer\")\n .action(async (productId: string, basePlanId: string, offerId: string) => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n\n await requireConfirm(`Delete offer \"${offerId}\"?`, program);\n\n if (isDryRun(program)) {\n const format = getOutputFormat(program, config);\n printDryRun(\n {\n command: \"subscriptions offers delete\",\n action: \"delete offer\",\n target: `${productId}/${basePlanId}/${offerId}`,\n },\n format,\n formatOutput,\n );\n return;\n }\n\n const client = await getClient(config);\n\n await deleteOffer(client, packageName, productId, basePlanId, offerId);\n console.log(`Offer ${offerId} deleted.`);\n });\n\n offers\n .command(\"activate <product-id> <base-plan-id> <offer-id>\")\n .description(\"Activate an offer\")\n .action(async (productId: string, basePlanId: string, offerId: string) => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n const format = getOutputFormat(program, config);\n\n if (isDryRun(program)) {\n printDryRun(\n {\n command: \"subscriptions offers activate\",\n action: \"activate offer\",\n target: `${productId}/${basePlanId}/${offerId}`,\n },\n format,\n formatOutput,\n );\n return;\n }\n\n const client = await getClient(config);\n\n const result = await activateOffer(client, packageName, productId, basePlanId, offerId);\n console.log(formatOutput(result, format));\n });\n\n offers\n .command(\"deactivate <product-id> <base-plan-id> <offer-id>\")\n .description(\"Deactivate an offer\")\n .action(async (productId: string, basePlanId: string, offerId: string) => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n const format = getOutputFormat(program, config);\n\n if (isDryRun(program)) {\n printDryRun(\n {\n command: \"subscriptions offers deactivate\",\n action: \"deactivate offer\",\n target: `${productId}/${basePlanId}/${offerId}`,\n },\n format,\n formatOutput,\n );\n return;\n }\n\n const client = await getClient(config);\n\n const result = await deactivateOffer(client, packageName, productId, basePlanId, offerId);\n console.log(formatOutput(result, format));\n });\n\n // --- Diff ---\n subs\n .command(\"diff <product-id>\")\n .description(\"Compare local JSON file against remote subscription\")\n .requiredOption(\"--file <path>\", \"Local JSON file to compare against remote\")\n .action(async (productId: string, options: { file: string }) => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n const client = await getClient(config);\n const format = getOutputFormat(program, config);\n\n const localData = (await readJsonFile(options.file)) as Subscription;\n const diffs = await diffSubscription(client, packageName, productId, localData);\n if (diffs.length === 0) {\n console.log(\"No differences found.\");\n } else {\n console.log(formatOutput(diffs, format));\n }\n });\n\n subs\n .command(\"analytics\")\n .description(\"Subscription catalog analytics: active plans, offer counts, state breakdown\")\n .action(async () => {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n const client = await getClient(config);\n const format = getOutputFormat(program, config);\n\n const result = await getSubscriptionAnalytics(client, packageName);\n\n if (format === \"json\") {\n console.log(formatOutput(result, format));\n return;\n }\n\n console.log(`\\nSubscription Analytics — ${packageName}`);\n console.log(`${\"─\".repeat(50)}`);\n console.log(`Total subscriptions: ${result.totalSubscriptions}`);\n console.log(`Active subscriptions: ${result.activeCount}`);\n console.log(`Active base plans: ${result.activeBasePlans}`);\n console.log(`Draft base plans: ${result.trialBasePlans}`);\n console.log(`Inactive base plans: ${result.pausedBasePlans}`);\n console.log(`Total offers: ${result.offerCount}`);\n\n if (result.byProductId.length > 0) {\n console.log(`\\nBy product:`);\n console.log(formatOutput(result.byProductId, format));\n }\n });\n}\n"],"mappings":"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","names":["subs","basePlans"]}
|