@gpc-cli/cli 0.9.62 → 0.9.64

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/README.md +12 -8
  2. package/dist/{__complete-QFD3SUAO.js → __complete-AZXI2O25.js} +2 -4
  3. package/dist/__complete-AZXI2O25.js.map +1 -0
  4. package/dist/{audit-M7GYID74.js → audit-BDPS5ODN.js} +4 -4
  5. package/dist/bin.js +2 -2
  6. package/dist/changelog-EHQYZP22.js +365 -0
  7. package/dist/changelog-EHQYZP22.js.map +1 -0
  8. package/dist/{chunk-QM5RTQ6R.js → chunk-I3SFXLIY.js} +29 -29
  9. package/dist/{completion-4I3IJK3M.js → completion-ZK7RPPFD.js} +7 -3
  10. package/dist/{completion-4I3IJK3M.js.map → completion-ZK7RPPFD.js.map} +1 -1
  11. package/dist/{config-B76LNM7C.js → config-SK7BOURM.js} +5 -5
  12. package/dist/docs-WVJCDX5X.js +378 -0
  13. package/dist/docs-WVJCDX5X.js.map +1 -0
  14. package/dist/{doctor-6SNZEFME.js → doctor-FSUI44DD.js} +5 -5
  15. package/dist/{enterprise-SIKXDT64.js → enterprise-L7DTIX2O.js} +4 -4
  16. package/dist/{external-transactions-JL3G4IG5.js → external-transactions-BP42CK3H.js} +4 -4
  17. package/dist/{feedback-JRTQBJUP.js → feedback-PDQU5E6S.js} +2 -2
  18. package/dist/generated/docs-bundle.json +1 -0
  19. package/dist/{grants-UHNBPIFD.js → grants-32DED5QL.js} +4 -4
  20. package/dist/{iap-ETOL7OAC.js → iap-EPJ76IAC.js} +4 -4
  21. package/dist/index.js +1 -1
  22. package/dist/{init-6CCSVJC2.js → init-OCBFI4VH.js} +6 -6
  23. package/dist/{listings-2Z6DSO3D.js → listings-QKRIVZG6.js} +6 -6
  24. package/dist/{one-time-products-Y5RNIPV2.js → one-time-products-OIDBVCFE.js} +4 -4
  25. package/dist/{publish-5HZAJEDZ.js → publish-H2IAOKP7.js} +4 -4
  26. package/dist/{purchases-AHWGLW6V.js → purchases-GFLYTKR3.js} +4 -4
  27. package/dist/{recovery-B7DZQ6XG.js → recovery-2VJJLAIQ.js} +4 -4
  28. package/dist/{releases-XY57V22L.js → releases-RTF5NPTD.js} +4 -4
  29. package/dist/{reviews-P4M6BEJI.js → reviews-GZ2VOIRN.js} +4 -4
  30. package/dist/{subscriptions-GTVJB4HX.js → subscriptions-JPHFBREY.js} +4 -4
  31. package/dist/{system-apks-L6M7QYB3.js → system-apks-KWTN5LHO.js} +4 -4
  32. package/dist/{testers-FGLBJAXL.js → testers-7ILUCKYB.js} +4 -4
  33. package/dist/{train-D2NKUW3M.js → train-G44NEK43.js} +4 -4
  34. package/dist/{update-6AGIO5DW.js → update-E4VGHQUR.js} +2 -2
  35. package/dist/{users-FOMAT7DY.js → users-W66YCFDX.js} +4 -4
  36. package/dist/{version-JL66BIVI.js → version-HXUIOHCL.js} +2 -2
  37. package/package.json +5 -3
  38. package/dist/__complete-QFD3SUAO.js.map +0 -1
  39. package/dist/changelog-OHZ4M7D6.js +0 -172
  40. package/dist/changelog-OHZ4M7D6.js.map +0 -1
  41. package/dist/docs-GP6AEX4N.js +0 -115
  42. package/dist/docs-GP6AEX4N.js.map +0 -1
  43. /package/dist/{audit-M7GYID74.js.map → audit-BDPS5ODN.js.map} +0 -0
  44. /package/dist/{chunk-QM5RTQ6R.js.map → chunk-I3SFXLIY.js.map} +0 -0
  45. /package/dist/{config-B76LNM7C.js.map → config-SK7BOURM.js.map} +0 -0
  46. /package/dist/{doctor-6SNZEFME.js.map → doctor-FSUI44DD.js.map} +0 -0
  47. /package/dist/{enterprise-SIKXDT64.js.map → enterprise-L7DTIX2O.js.map} +0 -0
  48. /package/dist/{external-transactions-JL3G4IG5.js.map → external-transactions-BP42CK3H.js.map} +0 -0
  49. /package/dist/{feedback-JRTQBJUP.js.map → feedback-PDQU5E6S.js.map} +0 -0
  50. /package/dist/{grants-UHNBPIFD.js.map → grants-32DED5QL.js.map} +0 -0
  51. /package/dist/{iap-ETOL7OAC.js.map → iap-EPJ76IAC.js.map} +0 -0
  52. /package/dist/{init-6CCSVJC2.js.map → init-OCBFI4VH.js.map} +0 -0
  53. /package/dist/{listings-2Z6DSO3D.js.map → listings-QKRIVZG6.js.map} +0 -0
  54. /package/dist/{one-time-products-Y5RNIPV2.js.map → one-time-products-OIDBVCFE.js.map} +0 -0
  55. /package/dist/{publish-5HZAJEDZ.js.map → publish-H2IAOKP7.js.map} +0 -0
  56. /package/dist/{purchases-AHWGLW6V.js.map → purchases-GFLYTKR3.js.map} +0 -0
  57. /package/dist/{recovery-B7DZQ6XG.js.map → recovery-2VJJLAIQ.js.map} +0 -0
  58. /package/dist/{releases-XY57V22L.js.map → releases-RTF5NPTD.js.map} +0 -0
  59. /package/dist/{reviews-P4M6BEJI.js.map → reviews-GZ2VOIRN.js.map} +0 -0
  60. /package/dist/{subscriptions-GTVJB4HX.js.map → subscriptions-JPHFBREY.js.map} +0 -0
  61. /package/dist/{system-apks-L6M7QYB3.js.map → system-apks-KWTN5LHO.js.map} +0 -0
  62. /package/dist/{testers-FGLBJAXL.js.map → testers-7ILUCKYB.js.map} +0 -0
  63. /package/dist/{train-D2NKUW3M.js.map → train-G44NEK43.js.map} +0 -0
  64. /package/dist/{update-6AGIO5DW.js.map → update-E4VGHQUR.js.map} +0 -0
  65. /package/dist/{users-FOMAT7DY.js.map → users-W66YCFDX.js.map} +0 -0
  66. /package/dist/{version-JL66BIVI.js.map → version-HXUIOHCL.js.map} +0 -0
@@ -3,12 +3,12 @@ import {
3
3
  isDryRun,
4
4
  printDryRun
5
5
  } from "./chunk-Y3QZDAKS.js";
6
- import {
7
- getOutputFormat
8
- } from "./chunk-ELXAK7GI.js";
9
6
  import {
10
7
  requireConfirm
11
8
  } from "./chunk-RZQSEDKI.js";
9
+ import {
10
+ getOutputFormat
11
+ } from "./chunk-ELXAK7GI.js";
12
12
 
13
13
  // src/commands/grants.ts
14
14
  import { loadConfig } from "@gpc-cli/config";
@@ -128,4 +128,4 @@ function registerGrantsCommands(program) {
128
128
  export {
129
129
  registerGrantsCommands
130
130
  };
131
- //# sourceMappingURL=grants-UHNBPIFD.js.map
131
+ //# sourceMappingURL=grants-32DED5QL.js.map
@@ -10,12 +10,12 @@ import {
10
10
  isDryRun,
11
11
  printDryRun
12
12
  } from "./chunk-Y3QZDAKS.js";
13
- import {
14
- getOutputFormat
15
- } from "./chunk-ELXAK7GI.js";
16
13
  import {
17
14
  requireConfirm
18
15
  } from "./chunk-RZQSEDKI.js";
16
+ import {
17
+ getOutputFormat
18
+ } from "./chunk-ELXAK7GI.js";
19
19
 
20
20
  // src/commands/iap.ts
21
21
  import { loadConfig } from "@gpc-cli/config";
@@ -201,4 +201,4 @@ function registerIapCommands(program) {
201
201
  export {
202
202
  registerIapCommands
203
203
  };
204
- //# sourceMappingURL=iap-ETOL7OAC.js.map
204
+ //# sourceMappingURL=iap-EPJ76IAC.js.map
package/dist/index.js CHANGED
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  createProgram,
4
4
  handleCliError
5
- } from "./chunk-QM5RTQ6R.js";
5
+ } from "./chunk-I3SFXLIY.js";
6
6
  export {
7
7
  createProgram,
8
8
  handleCliError
@@ -1,14 +1,14 @@
1
1
  #!/usr/bin/env node
2
- import {
3
- dim,
4
- green,
5
- yellow
6
- } from "./chunk-FAN4ZITI.js";
7
2
  import {
8
3
  isInteractive,
9
4
  promptInput,
10
5
  promptSelect
11
6
  } from "./chunk-RZQSEDKI.js";
7
+ import {
8
+ dim,
9
+ green,
10
+ yellow
11
+ } from "./chunk-FAN4ZITI.js";
12
12
 
13
13
  // src/commands/init.ts
14
14
  import { initProject } from "@gpc-cli/core";
@@ -67,4 +67,4 @@ function registerInitCommand(program) {
67
67
  export {
68
68
  registerInitCommand
69
69
  };
70
- //# sourceMappingURL=init-6CCSVJC2.js.map
70
+ //# sourceMappingURL=init-OCBFI4VH.js.map
@@ -10,6 +10,11 @@ import {
10
10
  isDryRun,
11
11
  printDryRun
12
12
  } from "./chunk-Y3QZDAKS.js";
13
+ import {
14
+ isInteractive,
15
+ requireConfirm,
16
+ requireOption
17
+ } from "./chunk-RZQSEDKI.js";
13
18
  import {
14
19
  green,
15
20
  red
@@ -17,11 +22,6 @@ import {
17
22
  import {
18
23
  getOutputFormat
19
24
  } from "./chunk-ELXAK7GI.js";
20
- import {
21
- isInteractive,
22
- requireConfirm,
23
- requireOption
24
- } from "./chunk-RZQSEDKI.js";
25
25
 
26
26
  // src/commands/listings.ts
27
27
  import { loadConfig } from "@gpc-cli/config";
@@ -448,4 +448,4 @@ Missing locales: ${missingLocales.join(", ")}`);
448
448
  export {
449
449
  registerListingsCommands
450
450
  };
451
- //# sourceMappingURL=listings-2Z6DSO3D.js.map
451
+ //# sourceMappingURL=listings-QKRIVZG6.js.map
@@ -10,12 +10,12 @@ import {
10
10
  isDryRun,
11
11
  printDryRun
12
12
  } from "./chunk-Y3QZDAKS.js";
13
- import {
14
- getOutputFormat
15
- } from "./chunk-ELXAK7GI.js";
16
13
  import {
17
14
  requireConfirm
18
15
  } from "./chunk-RZQSEDKI.js";
16
+ import {
17
+ getOutputFormat
18
+ } from "./chunk-ELXAK7GI.js";
19
19
 
20
20
  // src/commands/one-time-products.ts
21
21
  import { loadConfig } from "@gpc-cli/config";
@@ -469,4 +469,4 @@ function registerOneTimeProductsCommands(program) {
469
469
  export {
470
470
  registerOneTimeProductsCommands
471
471
  };
472
- //# sourceMappingURL=one-time-products-Y5RNIPV2.js.map
472
+ //# sourceMappingURL=one-time-products-OIDBVCFE.js.map
@@ -8,14 +8,14 @@ import {
8
8
  import {
9
9
  isDryRun
10
10
  } from "./chunk-Y3QZDAKS.js";
11
- import {
12
- getOutputFormat
13
- } from "./chunk-ELXAK7GI.js";
14
11
  import {
15
12
  isInteractive,
16
13
  promptInput,
17
14
  promptSelect
18
15
  } from "./chunk-RZQSEDKI.js";
16
+ import {
17
+ getOutputFormat
18
+ } from "./chunk-ELXAK7GI.js";
19
19
 
20
20
  // src/commands/publish.ts
21
21
  import { appendFile, stat } from "fs/promises";
@@ -227,4 +227,4 @@ function registerPublishCommand(program) {
227
227
  export {
228
228
  registerPublishCommand
229
229
  };
230
- //# sourceMappingURL=publish-5HZAJEDZ.js.map
230
+ //# sourceMappingURL=publish-H2IAOKP7.js.map
@@ -7,14 +7,14 @@ import {
7
7
  isDryRun,
8
8
  printDryRun
9
9
  } from "./chunk-Y3QZDAKS.js";
10
- import {
11
- getOutputFormat
12
- } from "./chunk-ELXAK7GI.js";
13
10
  import {
14
11
  isInteractive,
15
12
  requireConfirm,
16
13
  requireOption
17
14
  } from "./chunk-RZQSEDKI.js";
15
+ import {
16
+ getOutputFormat
17
+ } from "./chunk-ELXAK7GI.js";
18
18
 
19
19
  // src/commands/purchases.ts
20
20
  import { Option } from "commander";
@@ -396,4 +396,4 @@ Use one of these instead:
396
396
  export {
397
397
  registerPurchasesCommands
398
398
  };
399
- //# sourceMappingURL=purchases-AHWGLW6V.js.map
399
+ //# sourceMappingURL=purchases-GFLYTKR3.js.map
@@ -7,12 +7,12 @@ import {
7
7
  isDryRun,
8
8
  printDryRun
9
9
  } from "./chunk-Y3QZDAKS.js";
10
- import {
11
- getOutputFormat
12
- } from "./chunk-ELXAK7GI.js";
13
10
  import {
14
11
  requireConfirm
15
12
  } from "./chunk-RZQSEDKI.js";
13
+ import {
14
+ getOutputFormat
15
+ } from "./chunk-ELXAK7GI.js";
16
16
 
17
17
  // src/commands/recovery.ts
18
18
  import { loadConfig } from "@gpc-cli/config";
@@ -170,4 +170,4 @@ function registerRecoveryCommands(program) {
170
170
  export {
171
171
  registerRecoveryCommands
172
172
  };
173
- //# sourceMappingURL=recovery-B7DZQ6XG.js.map
173
+ //# sourceMappingURL=recovery-2VJJLAIQ.js.map
@@ -6,9 +6,6 @@ import {
6
6
  isDryRun,
7
7
  printDryRun
8
8
  } from "./chunk-Y3QZDAKS.js";
9
- import {
10
- getOutputFormat
11
- } from "./chunk-ELXAK7GI.js";
12
9
  import {
13
10
  isInteractive,
14
11
  promptInput,
@@ -16,6 +13,9 @@ import {
16
13
  requireConfirm,
17
14
  requireOption
18
15
  } from "./chunk-RZQSEDKI.js";
16
+ import {
17
+ getOutputFormat
18
+ } from "./chunk-ELXAK7GI.js";
19
19
 
20
20
  // src/commands/releases.ts
21
21
  import { appendFile, stat } from "fs/promises";
@@ -593,4 +593,4 @@ function registerReleasesCommands(program) {
593
593
  export {
594
594
  registerReleasesCommands
595
595
  };
596
- //# sourceMappingURL=releases-XY57V22L.js.map
596
+ //# sourceMappingURL=releases-RTF5NPTD.js.map
@@ -7,13 +7,13 @@ import {
7
7
  isDryRun,
8
8
  printDryRun
9
9
  } from "./chunk-Y3QZDAKS.js";
10
- import {
11
- getOutputFormat
12
- } from "./chunk-ELXAK7GI.js";
13
10
  import {
14
11
  isInteractive,
15
12
  requireOption
16
13
  } from "./chunk-RZQSEDKI.js";
14
+ import {
15
+ getOutputFormat
16
+ } from "./chunk-ELXAK7GI.js";
17
17
 
18
18
  // src/commands/reviews.ts
19
19
  import { loadConfig } from "@gpc-cli/config";
@@ -194,4 +194,4 @@ Rating distribution:`);
194
194
  export {
195
195
  registerReviewsCommands
196
196
  };
197
- //# sourceMappingURL=reviews-P4M6BEJI.js.map
197
+ //# sourceMappingURL=reviews-GZ2VOIRN.js.map
@@ -10,12 +10,12 @@ import {
10
10
  isDryRun,
11
11
  printDryRun
12
12
  } from "./chunk-Y3QZDAKS.js";
13
- import {
14
- getOutputFormat
15
- } from "./chunk-ELXAK7GI.js";
16
13
  import {
17
14
  requireConfirm
18
15
  } from "./chunk-RZQSEDKI.js";
16
+ import {
17
+ getOutputFormat
18
+ } from "./chunk-ELXAK7GI.js";
19
19
 
20
20
  // src/commands/subscriptions.ts
21
21
  import { Option } from "commander";
@@ -507,4 +507,4 @@ By product:`);
507
507
  export {
508
508
  registerSubscriptionsCommands
509
509
  };
510
- //# sourceMappingURL=subscriptions-GTVJB4HX.js.map
510
+ //# sourceMappingURL=subscriptions-JPHFBREY.js.map
@@ -10,12 +10,12 @@ import {
10
10
  isDryRun,
11
11
  printDryRun
12
12
  } from "./chunk-Y3QZDAKS.js";
13
- import {
14
- getOutputFormat
15
- } from "./chunk-ELXAK7GI.js";
16
13
  import {
17
14
  requireConfirm
18
15
  } from "./chunk-RZQSEDKI.js";
16
+ import {
17
+ getOutputFormat
18
+ } from "./chunk-ELXAK7GI.js";
19
19
 
20
20
  // src/commands/system-apks.ts
21
21
  import { loadConfig } from "@gpc-cli/config";
@@ -108,4 +108,4 @@ function registerSystemApksCommands(program) {
108
108
  export {
109
109
  registerSystemApksCommands
110
110
  };
111
- //# sourceMappingURL=system-apks-L6M7QYB3.js.map
111
+ //# sourceMappingURL=system-apks-KWTN5LHO.js.map
@@ -10,14 +10,14 @@ import {
10
10
  isDryRun,
11
11
  printDryRun
12
12
  } from "./chunk-Y3QZDAKS.js";
13
- import {
14
- getOutputFormat
15
- } from "./chunk-ELXAK7GI.js";
16
13
  import {
17
14
  isInteractive,
18
15
  requireConfirm,
19
16
  requireOption
20
17
  } from "./chunk-RZQSEDKI.js";
18
+ import {
19
+ getOutputFormat
20
+ } from "./chunk-ELXAK7GI.js";
21
21
 
22
22
  // src/commands/testers.ts
23
23
  import { loadConfig } from "@gpc-cli/config";
@@ -188,4 +188,4 @@ function registerTestersCommands(program) {
188
188
  export {
189
189
  registerTestersCommands
190
190
  };
191
- //# sourceMappingURL=testers-FGLBJAXL.js.map
191
+ //# sourceMappingURL=testers-7ILUCKYB.js.map
@@ -6,12 +6,12 @@ import {
6
6
  isDryRun,
7
7
  printDryRun
8
8
  } from "./chunk-Y3QZDAKS.js";
9
- import {
10
- getOutputFormat
11
- } from "./chunk-ELXAK7GI.js";
12
9
  import {
13
10
  requireConfirm
14
11
  } from "./chunk-RZQSEDKI.js";
12
+ import {
13
+ getOutputFormat
14
+ } from "./chunk-ELXAK7GI.js";
15
15
 
16
16
  // src/commands/train.ts
17
17
  import { loadConfig } from "@gpc-cli/config";
@@ -122,4 +122,4 @@ function registerTrainCommands(program) {
122
122
  export {
123
123
  registerTrainCommands
124
124
  };
125
- //# sourceMappingURL=train-D2NKUW3M.js.map
125
+ //# sourceMappingURL=train-G44NEK43.js.map
@@ -17,7 +17,7 @@ function registerUpdateCommand(program) {
17
17
  program.command("update").description("Update gpc to the latest version").option("--check", "Check for updates without installing (exits 0 always)").option("--force", "Update even if already on the latest version").action(async (opts, cmd) => {
18
18
  const parentOpts = cmd.parent?.opts() ?? {};
19
19
  const jsonMode = !!(parentOpts["json"] || parentOpts["output"] === "json");
20
- const currentVersion = "0.9.62";
20
+ const currentVersion = "0.9.64";
21
21
  if (currentVersion === "0.0.0") {
22
22
  if (jsonMode) {
23
23
  console.log(
@@ -172,4 +172,4 @@ Run: gpc update`);
172
172
  export {
173
173
  registerUpdateCommand
174
174
  };
175
- //# sourceMappingURL=update-6AGIO5DW.js.map
175
+ //# sourceMappingURL=update-E4VGHQUR.js.map
@@ -3,12 +3,12 @@ import {
3
3
  isDryRun,
4
4
  printDryRun
5
5
  } from "./chunk-Y3QZDAKS.js";
6
- import {
7
- getOutputFormat
8
- } from "./chunk-ELXAK7GI.js";
9
6
  import {
10
7
  requireConfirm
11
8
  } from "./chunk-RZQSEDKI.js";
9
+ import {
10
+ getOutputFormat
11
+ } from "./chunk-ELXAK7GI.js";
12
12
 
13
13
  // src/commands/users.ts
14
14
  import { loadConfig } from "@gpc-cli/config";
@@ -162,4 +162,4 @@ function registerUsersCommands(program) {
162
162
  export {
163
163
  registerUsersCommands
164
164
  };
165
- //# sourceMappingURL=users-FOMAT7DY.js.map
165
+ //# sourceMappingURL=users-W66YCFDX.js.map
@@ -7,7 +7,7 @@ import "./chunk-3SJ6OXCZ.js";
7
7
  // src/commands/version.ts
8
8
  function registerVersionCommand(program) {
9
9
  program.command("version").description("Show version information").action(() => {
10
- const version = "0.9.62";
10
+ const version = "0.9.64";
11
11
  if (program.opts()["output"] === "json") {
12
12
  console.log(
13
13
  JSON.stringify({
@@ -25,4 +25,4 @@ function registerVersionCommand(program) {
25
25
  export {
26
26
  registerVersionCommand
27
27
  };
28
- //# sourceMappingURL=version-JL66BIVI.js.map
28
+ //# sourceMappingURL=version-HXUIOHCL.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gpc-cli/cli",
3
- "version": "0.9.62",
3
+ "version": "0.9.64",
4
4
  "description": "GPC — Google Play Console CLI. 217 API endpoints including Managed Google Play. Upload AABs, manage releases, monitor vitals, publish private enterprise apps. Fastlane alternative for Android.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -21,9 +21,9 @@
21
21
  "commander": "^14.0.3",
22
22
  "@gpc-cli/api": "1.0.36",
23
23
  "@gpc-cli/config": "0.9.14",
24
+ "@gpc-cli/core": "0.9.54",
24
25
  "@gpc-cli/auth": "0.9.14",
25
- "@gpc-cli/plugin-sdk": "0.9.10",
26
- "@gpc-cli/core": "0.9.52"
26
+ "@gpc-cli/plugin-sdk": "0.9.10"
27
27
  },
28
28
  "keywords": [
29
29
  "google-play",
@@ -53,7 +53,9 @@
53
53
  "url": "https://github.com/yasserstudio/gpc"
54
54
  },
55
55
  "scripts": {
56
+ "prebuild": "tsx ../../scripts/build-docs-bundle.ts",
56
57
  "build": "tsup",
58
+ "postbuild": "mkdir -p dist/generated && cp src/generated/docs-bundle.json dist/generated/",
57
59
  "dev": "tsup --watch",
58
60
  "test": "vitest run",
59
61
  "test:watch": "vitest",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/commands/__complete.ts"],"sourcesContent":["import { readFile, readdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { Command } from \"commander\";\nimport { getCacheDir, getUserConfigPath, listProfiles } from \"@gpc-cli/config\";\n\n// Keep this file dependency-light on purpose.\n// It is called on every TAB press; loading @gpc-cli/api or @gpc-cli/auth would\n// blow the <100ms cold-start budget. Only pull from @gpc-cli/config + node:fs.\n\nconst STATIC_TRACKS = [\"production\", \"beta\", \"alpha\", \"internal\"] as const;\n\nconst DEBUG = process.env[\"GPC_DEBUG\"] === \"1\";\n\nfunction debug(msg: string): void {\n if (DEBUG) process.stderr.write(`[gpc __complete] ${msg}\\n`);\n}\n\n/** Emit one value per line; silent on any error. */\nfunction emit(values: readonly string[]): void {\n for (const v of values) {\n if (v) console.log(v);\n }\n}\n\n// Prototype-pollution defense: strip __proto__/constructor/prototype from\n// parsed JSON. Mirrors packages/config/src/loader.ts:92 so cache and config\n// files are treated consistently.\nconst DANGEROUS_KEYS = new Set([\"__proto__\", \"constructor\", \"prototype\"]);\nfunction sanitize(obj: unknown): void {\n if (!obj || typeof obj !== \"object\") return;\n if (Array.isArray(obj)) {\n for (const item of obj) sanitize(item);\n return;\n }\n const record = obj as Record<string, unknown>;\n for (const key of Object.keys(record)) {\n if (DANGEROUS_KEYS.has(key)) {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete record[key];\n } else if (typeof record[key] === \"object\" && record[key] !== null) {\n sanitize(record[key]);\n }\n }\n}\n\nasync function readJson<T>(path: string): Promise<T | null> {\n try {\n const raw = await readFile(path, \"utf-8\");\n const parsed = JSON.parse(raw) as T;\n sanitize(parsed);\n return parsed;\n } catch (err) {\n // Silent fallback is by design (empty/stale cache is indistinguishable\n // from corrupt from the user's POV), but under GPC_DEBUG=1 surface the\n // error so authors can diagnose bad config or cache files.\n debug(`readJson(${path}) failed: ${err instanceof Error ? err.message : String(err)}`);\n return null;\n }\n}\n\ninterface ProfileEntry {\n app?: string;\n}\ninterface RawConfig {\n app?: string;\n profiles?: Record<string, ProfileEntry>;\n}\n\nasync function readProjectConfig(): Promise<RawConfig | null> {\n return readJson<RawConfig>(join(process.cwd(), \".gpcrc.json\"));\n}\n\nasync function readUserConfig(): Promise<RawConfig | null> {\n return readJson<RawConfig>(getUserConfigPath());\n}\n\nasync function cachedPackageNames(): Promise<string[]> {\n try {\n const entries = await readdir(getCacheDir());\n return entries\n .filter((f) => f.startsWith(\"status-\") && f.endsWith(\".json\"))\n .map((f) => f.slice(\"status-\".length, -\".json\".length));\n } catch {\n return [];\n }\n}\n\ninterface StatusCacheEntry {\n fetchedAt?: string;\n ttl?: number;\n data?: {\n releases?: Array<{ track?: string; versionCode?: string }>;\n };\n}\n\nasync function readFreshStatusCache(packageName: string): Promise<StatusCacheEntry | null> {\n const entry = await readJson<StatusCacheEntry>(\n join(getCacheDir(), `status-${packageName}.json`),\n );\n if (!entry?.fetchedAt) return null;\n const ttl = entry.ttl ?? 3600;\n const ageSec = (Date.now() - new Date(entry.fetchedAt).getTime()) / 1000;\n if (ageSec > ttl) return null;\n return entry;\n}\n\nexport async function runContext(context: string, args: readonly string[] = []): Promise<string[]> {\n switch (context) {\n case \"profiles\":\n return completeProfiles();\n case \"packages\":\n return completePackages();\n case \"tracks-for-app\":\n return completeTracksForApp(args[0]);\n case \"releases-for-track\":\n return completeReleasesForTrack(args[0], args[1]);\n default:\n return [];\n }\n}\n\nexport async function completeProfiles(): Promise<string[]> {\n return listProfiles();\n}\n\nexport async function completePackages(): Promise<string[]> {\n const seen = new Set<string>();\n const [proj, user, cached] = await Promise.all([\n readProjectConfig(),\n readUserConfig(),\n cachedPackageNames(),\n ]);\n for (const cfg of [proj, user]) {\n if (cfg?.app) seen.add(cfg.app);\n if (cfg?.profiles) {\n for (const p of Object.values(cfg.profiles)) {\n if (p?.app) seen.add(p.app);\n }\n }\n }\n for (const pkg of cached) seen.add(pkg);\n return [...seen].sort();\n}\n\nexport async function completeTracksForApp(packageName: string | undefined): Promise<string[]> {\n const tracks = new Set<string>(STATIC_TRACKS);\n if (packageName) {\n const entry = await readFreshStatusCache(packageName);\n for (const r of entry?.data?.releases ?? []) {\n if (r.track) tracks.add(r.track);\n }\n } else {\n // No package arg: shell scripts don't currently parse the already-typed\n // --app value. As a best-effort, aggregate custom track names from every\n // fresh status cache so `gpc --track <TAB>` still surfaces non-standard\n // tracks the user has published to recently.\n const packages = await cachedPackageNames();\n const entries = await Promise.all(packages.map((p) => readFreshStatusCache(p)));\n for (const entry of entries) {\n for (const r of entry?.data?.releases ?? []) {\n if (r.track) tracks.add(r.track);\n }\n }\n }\n return [...tracks];\n}\n\nexport async function completeReleasesForTrack(\n packageName: string | undefined,\n track: string | undefined,\n): Promise<string[]> {\n if (!packageName || !track) return [];\n const entry = await readFreshStatusCache(packageName);\n return (entry?.data?.releases ?? [])\n .filter((r) => r.track === track && r.versionCode)\n .map((r) => r.versionCode as string);\n}\n\n/** Register the hidden `__complete` subcommand on the program. */\nexport function registerCompleteCommand(program: Command): void {\n const complete = new Command(\"__complete\")\n .description(\"Internal: shell completion value provider (hidden)\")\n .argument(\"<context>\", \"profiles | packages | tracks-for-app | releases-for-track\")\n .argument(\"[args...]\", \"Context-specific positional args\")\n .allowUnknownOption(true)\n .action(async (context: string, args: string[]) => {\n try {\n const values = await runContext(context, args);\n emit(values);\n } catch {\n // Never throw from a completion handler.\n }\n });\n\n program.addCommand(complete, { hidden: true });\n}\n"],"mappings":"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","names":[]}
@@ -1,172 +0,0 @@
1
- #!/usr/bin/env node
2
- import {
3
- getClient,
4
- resolvePackageName
5
- } from "./chunk-JDRY7HK5.js";
6
- import {
7
- dim,
8
- yellow
9
- } from "./chunk-FAN4ZITI.js";
10
- import {
11
- getOutputFormat
12
- } from "./chunk-ELXAK7GI.js";
13
-
14
- // src/commands/changelog.ts
15
- import {
16
- fetchChangelog,
17
- formatChangelogEntry,
18
- formatOutput,
19
- generateChangelog,
20
- RENDERERS,
21
- renderPlayStore,
22
- resolveLocales,
23
- GpcError
24
- } from "@gpc-cli/core";
25
- import { loadConfig } from "@gpc-cli/config";
26
- var VALID_OUTPUT_MODES = ["md", "json", "prompt"];
27
- var VALID_TARGETS = ["github", "play-store"];
28
- var REPO_RE = /^[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+$/;
29
- function registerChangelogCommand(program) {
30
- const changelog = program.command("changelog").description("Show release history").option("-n, --limit <count>", "Number of releases to show", parseInt, 5).option("--tag <tag>", "Show a specific release (e.g., v0.9.43)").option("--all", "Show all releases").action(async (opts) => {
31
- const config = await loadConfig();
32
- const format = getOutputFormat(program, config);
33
- const entries = await fetchChangelog({
34
- limit: opts.all ? 100 : opts.limit,
35
- version: opts.tag
36
- });
37
- if (entries.length === 0) {
38
- console.log("No releases found.");
39
- return;
40
- }
41
- if (format === "json") {
42
- console.log(formatOutput(entries, "json"));
43
- return;
44
- }
45
- if (opts.tag || entries.length === 1) {
46
- console.log(formatChangelogEntry(entries[0]));
47
- return;
48
- }
49
- const header = "VERSION DATE TITLE";
50
- const separator = "\u2500".repeat(header.length);
51
- console.log(header);
52
- console.log(separator);
53
- for (const entry of entries) {
54
- const version = entry.version.padEnd(12);
55
- const date = entry.date.padEnd(12);
56
- console.log(`${version} ${date} ${entry.title}`);
57
- }
58
- console.log("");
59
- console.log(
60
- `Showing ${entries.length} releases. Use --tag <tag> for details, or --all for full history.`
61
- );
62
- });
63
- changelog.command("generate").description("Generate release notes from local git commits").option("--from <ref>", "Starting ref (default: latest v* tag)").option("--to <ref>", "Ending ref (default: HEAD)").option("--format <mode>", "Renderer: md, json, or prompt", "md").option("--repo <owner/name>", "Override auto-detected repo (e.g., yasserstudio/gpc)").option("--target <mode>", "Output target: github or play-store", "github").option("--locales <csv|auto>", "Comma-separated BCP 47 locales, or 'auto' (play-store target only)").option("--strict", "Exit non-zero if linter warnings or locale overflows are emitted").action(
64
- async (opts) => {
65
- const mode = opts.format;
66
- if (!VALID_OUTPUT_MODES.includes(mode)) {
67
- process.stderr.write(
68
- `Invalid --format "${opts.format}". Valid: ${VALID_OUTPUT_MODES.join(", ")}
69
- `
70
- );
71
- process.exitCode = 2;
72
- return;
73
- }
74
- if (!VALID_TARGETS.includes(opts.target)) {
75
- process.stderr.write(
76
- `Invalid --target "${opts.target}". Valid: ${VALID_TARGETS.join(", ")}
77
- `
78
- );
79
- process.exitCode = 2;
80
- return;
81
- }
82
- const target = opts.target;
83
- if (opts.repo && !REPO_RE.test(opts.repo)) {
84
- process.stderr.write(
85
- `Invalid --repo "${opts.repo}". Expected "owner/name" (e.g., yasserstudio/gpc).
86
- `
87
- );
88
- process.exitCode = 2;
89
- return;
90
- }
91
- if (target === "github" && opts.locales) {
92
- process.stderr.write(
93
- `--locales only applies to --target play-store (current target: github)
94
- `
95
- );
96
- process.exitCode = 2;
97
- return;
98
- }
99
- if (target === "play-store" && !opts.locales) {
100
- process.stderr.write(
101
- "--target play-store requires --locales <csv|auto>\n Example: --locales en-US,fr-FR,de-DE\n Example: --locales auto (reads current Play Store listing \u2014 requires --app)\n"
102
- );
103
- process.exitCode = 2;
104
- return;
105
- }
106
- const generated = await generateChangelog({
107
- from: opts.from,
108
- to: opts.to,
109
- repo: opts.repo
110
- });
111
- for (const w of generated.warnings) {
112
- process.stderr.write(`${yellow("warn:")} ${w}
113
- `);
114
- }
115
- if (generated.warnings.length > 0) {
116
- process.stderr.write(
117
- `${dim(`(${generated.warnings.length} warning${generated.warnings.length === 1 ? "" : "s"} \u2014 review before publishing)`)}
118
- `
119
- );
120
- }
121
- if (target === "github") {
122
- const output2 = RENDERERS[mode](generated);
123
- console.log(output2);
124
- if (opts.strict && generated.warnings.length > 0) {
125
- process.exitCode = 1;
126
- }
127
- return;
128
- }
129
- let locales;
130
- try {
131
- if (opts.locales === "auto") {
132
- const config = await loadConfig();
133
- const packageName = resolvePackageName(program.opts()["app"], config);
134
- const client = await getClient(config);
135
- locales = await resolveLocales("auto", { client, packageName });
136
- } else {
137
- locales = await resolveLocales(opts.locales);
138
- }
139
- } catch (error) {
140
- if (error instanceof GpcError) {
141
- process.stderr.write(`${error.message}
142
- `);
143
- if (error.suggestion) process.stderr.write(`${dim(error.suggestion)}
144
- `);
145
- process.exitCode = error.exitCode;
146
- return;
147
- }
148
- throw error;
149
- }
150
- const { output, bundle } = renderPlayStore(generated, {
151
- locales,
152
- format: mode
153
- });
154
- console.log(output);
155
- for (const lang of bundle.overflows) {
156
- process.stderr.write(
157
- `${yellow("warn:")} ${lang} exceeds ${bundle.limit} chars (truncated)
158
- `
159
- );
160
- }
161
- const hasOverflow = bundle.overflows.length > 0;
162
- const hasWarnings = generated.warnings.length > 0;
163
- if (opts.strict && (hasWarnings || hasOverflow)) {
164
- process.exitCode = 1;
165
- }
166
- }
167
- );
168
- }
169
- export {
170
- registerChangelogCommand
171
- };
172
- //# sourceMappingURL=changelog-OHZ4M7D6.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/commands/changelog.ts"],"sourcesContent":["import type { Command } from \"commander\";\nimport {\n fetchChangelog,\n formatChangelogEntry,\n formatOutput,\n generateChangelog,\n RENDERERS,\n renderPlayStore,\n resolveLocales,\n GpcError,\n type OutputMode,\n type PlayStoreFormat,\n} from \"@gpc-cli/core\";\nimport { loadConfig } from \"@gpc-cli/config\";\nimport { getOutputFormat } from \"../format.js\";\nimport { yellow, dim } from \"../colors.js\";\nimport { resolvePackageName, getClient } from \"../resolve.js\";\n\nconst VALID_OUTPUT_MODES: OutputMode[] = [\"md\", \"json\", \"prompt\"];\nconst VALID_TARGETS = [\"github\", \"play-store\"] as const;\ntype ChangelogTarget = (typeof VALID_TARGETS)[number];\nconst REPO_RE = /^[A-Za-z0-9_.-]+\\/[A-Za-z0-9_.-]+$/;\n\nexport function registerChangelogCommand(program: Command): void {\n const changelog = program\n .command(\"changelog\")\n .description(\"Show release history\")\n .option(\"-n, --limit <count>\", \"Number of releases to show\", parseInt, 5)\n .option(\"--tag <tag>\", \"Show a specific release (e.g., v0.9.43)\")\n .option(\"--all\", \"Show all releases\")\n .action(async (opts: { limit: number; tag?: string; all?: boolean }) => {\n const config = await loadConfig();\n const format = getOutputFormat(program, config);\n\n const entries = await fetchChangelog({\n limit: opts.all ? 100 : opts.limit,\n version: opts.tag,\n });\n\n if (entries.length === 0) {\n console.log(\"No releases found.\");\n return;\n }\n\n if (format === \"json\") {\n console.log(formatOutput(entries, \"json\"));\n return;\n }\n\n if (opts.tag || entries.length === 1) {\n console.log(formatChangelogEntry(entries[0]!));\n return;\n }\n\n const header = \"VERSION DATE TITLE\";\n const separator = \"─\".repeat(header.length);\n console.log(header);\n console.log(separator);\n for (const entry of entries) {\n const version = entry.version.padEnd(12);\n const date = entry.date.padEnd(12);\n console.log(`${version} ${date} ${entry.title}`);\n }\n console.log(\"\");\n console.log(\n `Showing ${entries.length} releases. Use --tag <tag> for details, or --all for full history.`,\n );\n });\n\n changelog\n .command(\"generate\")\n .description(\"Generate release notes from local git commits\")\n .option(\"--from <ref>\", \"Starting ref (default: latest v* tag)\")\n .option(\"--to <ref>\", \"Ending ref (default: HEAD)\")\n .option(\"--format <mode>\", \"Renderer: md, json, or prompt\", \"md\")\n .option(\"--repo <owner/name>\", \"Override auto-detected repo (e.g., yasserstudio/gpc)\")\n .option(\"--target <mode>\", \"Output target: github or play-store\", \"github\")\n .option(\"--locales <csv|auto>\", \"Comma-separated BCP 47 locales, or 'auto' (play-store target only)\")\n .option(\"--strict\", \"Exit non-zero if linter warnings or locale overflows are emitted\")\n .action(\n async (opts: {\n from?: string;\n to?: string;\n format: string;\n repo?: string;\n target: string;\n locales?: string;\n strict?: boolean;\n }) => {\n const mode = opts.format as OutputMode;\n if (!VALID_OUTPUT_MODES.includes(mode)) {\n process.stderr.write(\n `Invalid --format \"${opts.format}\". Valid: ${VALID_OUTPUT_MODES.join(\", \")}\\n`,\n );\n process.exitCode = 2;\n return;\n }\n if (!VALID_TARGETS.includes(opts.target as ChangelogTarget)) {\n process.stderr.write(\n `Invalid --target \"${opts.target}\". Valid: ${VALID_TARGETS.join(\", \")}\\n`,\n );\n process.exitCode = 2;\n return;\n }\n const target = opts.target as ChangelogTarget;\n if (opts.repo && !REPO_RE.test(opts.repo)) {\n process.stderr.write(\n `Invalid --repo \"${opts.repo}\". Expected \"owner/name\" (e.g., yasserstudio/gpc).\\n`,\n );\n process.exitCode = 2;\n return;\n }\n if (target === \"github\" && opts.locales) {\n process.stderr.write(\n `--locales only applies to --target play-store (current target: github)\\n`,\n );\n process.exitCode = 2;\n return;\n }\n if (target === \"play-store\" && !opts.locales) {\n process.stderr.write(\n \"--target play-store requires --locales <csv|auto>\\n\" +\n \" Example: --locales en-US,fr-FR,de-DE\\n\" +\n \" Example: --locales auto (reads current Play Store listing — requires --app)\\n\",\n );\n process.exitCode = 2;\n return;\n }\n\n const generated = await generateChangelog({\n from: opts.from,\n to: opts.to,\n repo: opts.repo,\n });\n\n for (const w of generated.warnings) {\n process.stderr.write(`${yellow(\"warn:\")} ${w}\\n`);\n }\n if (generated.warnings.length > 0) {\n process.stderr.write(\n `${dim(`(${generated.warnings.length} warning${generated.warnings.length === 1 ? \"\" : \"s\"} — review before publishing)`)}\\n`,\n );\n }\n\n if (target === \"github\") {\n const output = RENDERERS[mode](generated);\n console.log(output);\n if (opts.strict && generated.warnings.length > 0) {\n process.exitCode = 1;\n }\n return;\n }\n\n // target === \"play-store\"\n let locales: string[];\n try {\n if (opts.locales === \"auto\") {\n const config = await loadConfig();\n const packageName = resolvePackageName(program.opts()[\"app\"], config);\n const client = await getClient(config);\n locales = await resolveLocales(\"auto\", { client, packageName });\n } else {\n locales = await resolveLocales(opts.locales!);\n }\n } catch (error) {\n if (error instanceof GpcError) {\n process.stderr.write(`${error.message}\\n`);\n if (error.suggestion) process.stderr.write(`${dim(error.suggestion)}\\n`);\n process.exitCode = error.exitCode;\n return;\n }\n throw error;\n }\n\n const { output, bundle } = renderPlayStore(generated, {\n locales,\n format: mode as PlayStoreFormat,\n });\n console.log(output);\n\n for (const lang of bundle.overflows) {\n process.stderr.write(\n `${yellow(\"warn:\")} ${lang} exceeds ${bundle.limit} chars (truncated)\\n`,\n );\n }\n\n const hasOverflow = bundle.overflows.length > 0;\n const hasWarnings = generated.warnings.length > 0;\n if (opts.strict && (hasWarnings || hasOverflow)) {\n process.exitCode = 1;\n }\n },\n );\n}\n"],"mappings":"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","names":["output"]}