@gpc-cli/cli 0.9.44 → 0.9.46

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 (168) hide show
  1. package/dist/{anomalies-NU2IN2GJ.js → anomalies-UDE4NGHJ.js} +19 -24
  2. package/dist/anomalies-UDE4NGHJ.js.map +1 -0
  3. package/dist/{apps-J2446UDA.js → apps-FKD3ZG5X.js} +31 -35
  4. package/dist/apps-FKD3ZG5X.js.map +1 -0
  5. package/dist/{audit-N2CRHWUN.js → audit-JASSHRWN.js} +47 -62
  6. package/dist/audit-JASSHRWN.js.map +1 -0
  7. package/dist/{auth-XGSTT5G5.js → auth-OTA3SV3J.js} +145 -103
  8. package/dist/auth-OTA3SV3J.js.map +1 -0
  9. package/dist/bin.js +6 -4
  10. package/dist/bin.js.map +1 -1
  11. package/dist/bundle-F7MUVC5J.js +204 -0
  12. package/dist/bundle-F7MUVC5J.js.map +1 -0
  13. package/dist/{cache-SLNFRTI2.js → cache-XKPLZYEB.js} +4 -5
  14. package/dist/cache-XKPLZYEB.js.map +1 -0
  15. package/dist/changelog-7COFZO7Q.js +48 -0
  16. package/dist/changelog-7COFZO7Q.js.map +1 -0
  17. package/dist/{chunk-4O4D5SGL.js → chunk-3SJ6OXCZ.js} +4 -5
  18. package/dist/chunk-3SJ6OXCZ.js.map +1 -0
  19. package/dist/{chunk-7LURVNQV.js → chunk-6OWN6S6X.js} +53 -49
  20. package/dist/{chunk-7LURVNQV.js.map → chunk-6OWN6S6X.js.map} +1 -1
  21. package/dist/{chunk-U6ZTQ34I.js → chunk-BCBXQC7J.js} +45 -11
  22. package/dist/chunk-BCBXQC7J.js.map +1 -0
  23. package/dist/{chunk-AA577WVQ.js → chunk-NQH4G7BI.js} +9 -3
  24. package/dist/chunk-NQH4G7BI.js.map +1 -0
  25. package/dist/chunk-SLNJEAMK.js +23 -0
  26. package/dist/chunk-SLNJEAMK.js.map +1 -0
  27. package/dist/{chunk-NV75I5VP.js → chunk-YFUBD2XB.js} +10 -8
  28. package/dist/chunk-YFUBD2XB.js.map +1 -0
  29. package/dist/{config-222P3MKK.js → config-2FTCYEGD.js} +8 -5
  30. package/dist/config-2FTCYEGD.js.map +1 -0
  31. package/dist/{data-safety-Q7FTCEWU.js → data-safety-AFMD6MYI.js} +12 -27
  32. package/dist/data-safety-AFMD6MYI.js.map +1 -0
  33. package/dist/{device-tiers-MIOQEXYY.js → device-tiers-AQAMUQXI.js} +23 -38
  34. package/dist/device-tiers-AQAMUQXI.js.map +1 -0
  35. package/dist/diff-6EO4ID6W.js +91 -0
  36. package/dist/diff-6EO4ID6W.js.map +1 -0
  37. package/dist/{docs-7DUXIKA3.js → docs-4D2SJ4LY.js} +4 -3
  38. package/dist/docs-4D2SJ4LY.js.map +1 -0
  39. package/dist/doctor-H4X7Q57B.js +691 -0
  40. package/dist/doctor-H4X7Q57B.js.map +1 -0
  41. package/dist/{enterprise-7THXNBTC.js → enterprise-7PWXMSUN.js} +11 -21
  42. package/dist/enterprise-7PWXMSUN.js.map +1 -0
  43. package/dist/{external-transactions-2GWIMUVM.js → external-transactions-LCZALS3V.js} +12 -28
  44. package/dist/external-transactions-LCZALS3V.js.map +1 -0
  45. package/dist/{feedback-2W2XJGZX.js → feedback-XP765TOO.js} +4 -4
  46. package/dist/{games-BT777WUO.js → games-ZSNGEI7A.js} +17 -32
  47. package/dist/games-ZSNGEI7A.js.map +1 -0
  48. package/dist/{generated-apks-RJWTIX7L.js → generated-apks-RX2IUWSF.js} +30 -38
  49. package/dist/generated-apks-RX2IUWSF.js.map +1 -0
  50. package/dist/{grants-TKQJ3IER.js → grants-EBPECI26.js} +22 -40
  51. package/dist/grants-EBPECI26.js.map +1 -0
  52. package/dist/{iap-ICAEQLK5.js → iap-OUI5YYN4.js} +30 -51
  53. package/dist/iap-OUI5YYN4.js.map +1 -0
  54. package/dist/index.js +1 -1
  55. package/dist/{init-JZ2THPMS.js → init-WSTQTJOD.js} +5 -4
  56. package/dist/init-WSTQTJOD.js.map +1 -0
  57. package/dist/{install-skills-OV4HVANW.js → install-skills-6QDUXI5F.js} +5 -6
  58. package/dist/{install-skills-OV4HVANW.js.map → install-skills-6QDUXI5F.js.map} +1 -1
  59. package/dist/{internal-sharing-3U2XFHA4.js → internal-sharing-ONNIWIAT.js} +3 -4
  60. package/dist/{internal-sharing-3U2XFHA4.js.map → internal-sharing-ONNIWIAT.js.map} +1 -1
  61. package/dist/{listings-77HZW4S5.js → listings-7SGQ4SRX.js} +118 -157
  62. package/dist/listings-7SGQ4SRX.js.map +1 -0
  63. package/dist/migrate-ZQCJGQQS.js +138 -0
  64. package/dist/migrate-ZQCJGQQS.js.map +1 -0
  65. package/dist/{one-time-products-LHZAXQES.js → one-time-products-MGZTU7OM.js} +65 -120
  66. package/dist/one-time-products-MGZTU7OM.js.map +1 -0
  67. package/dist/{preflight-H3HEBYQW.js → preflight-N7ZRG2JI.js} +58 -55
  68. package/dist/preflight-N7ZRG2JI.js.map +1 -0
  69. package/dist/{pricing-XQSDTTK5.js → pricing-JJZFICFL.js} +8 -8
  70. package/dist/{pricing-XQSDTTK5.js.map → pricing-JJZFICFL.js.map} +1 -1
  71. package/dist/{prompt-BSV22CQZ.js → prompt-GXC2JSLA.js} +2 -2
  72. package/dist/{publish-Q5ZKEKZ5.js → publish-JPTI4EBT.js} +34 -30
  73. package/dist/publish-JPTI4EBT.js.map +1 -0
  74. package/dist/{purchase-options-CKRN4VIW.js → purchase-options-KFWW4JW2.js} +16 -11
  75. package/dist/purchase-options-KFWW4JW2.js.map +1 -0
  76. package/dist/purchases-DAWTMXP6.js +383 -0
  77. package/dist/purchases-DAWTMXP6.js.map +1 -0
  78. package/dist/{quickstart-4HB62YEL.js → quickstart-Z5Y3FYJU.js} +5 -3
  79. package/dist/quickstart-Z5Y3FYJU.js.map +1 -0
  80. package/dist/{quota-UHIQQYOY.js → quota-MZRWYJGR.js} +5 -15
  81. package/dist/quota-MZRWYJGR.js.map +1 -0
  82. package/dist/{recovery-5EV2R476.js → recovery-YE3Z7NIN.js} +32 -61
  83. package/dist/recovery-YE3Z7NIN.js.map +1 -0
  84. package/dist/{releases-C2WC2K4E.js → releases-2I3WBULC.js} +184 -185
  85. package/dist/releases-2I3WBULC.js.map +1 -0
  86. package/dist/{reports-2YX3RDOS.js → reports-CIB2T3XT.js} +19 -21
  87. package/dist/reports-CIB2T3XT.js.map +1 -0
  88. package/dist/reviews-BCCXIQ6C.js +188 -0
  89. package/dist/reviews-BCCXIQ6C.js.map +1 -0
  90. package/dist/{status-WHGLODGV.js → status-6LH5W4FU.js} +105 -83
  91. package/dist/status-6LH5W4FU.js.map +1 -0
  92. package/dist/{subscriptions-CI3JH3VQ.js → subscriptions-DZP3Y7O7.js} +142 -232
  93. package/dist/subscriptions-DZP3Y7O7.js.map +1 -0
  94. package/dist/{testers-NZOFA3EF.js → testers-LSMBXCA2.js} +24 -44
  95. package/dist/testers-LSMBXCA2.js.map +1 -0
  96. package/dist/tracks-YHMO2A6B.js +98 -0
  97. package/dist/tracks-YHMO2A6B.js.map +1 -0
  98. package/dist/{train-XKE4JN3Y.js → train-MDD2EBHS.js} +35 -55
  99. package/dist/train-MDD2EBHS.js.map +1 -0
  100. package/dist/{update-QMPRL5Y6.js → update-OMALGIBR.js} +30 -15
  101. package/dist/update-OMALGIBR.js.map +1 -0
  102. package/dist/{users-2YTC4Q36.js → users-UKG7VIQH.js} +45 -67
  103. package/dist/users-UKG7VIQH.js.map +1 -0
  104. package/dist/{validate-UOVTM6L3.js → validate-QIYSA3N7.js} +8 -10
  105. package/dist/validate-QIYSA3N7.js.map +1 -0
  106. package/dist/{version-NK5SJLHJ.js → version-NCSNXNVN.js} +4 -4
  107. package/dist/{vitals-A4CS4MSS.js → vitals-C23L2Y2E.js} +153 -172
  108. package/dist/vitals-C23L2Y2E.js.map +1 -0
  109. package/package.json +6 -6
  110. package/dist/anomalies-NU2IN2GJ.js.map +0 -1
  111. package/dist/apps-J2446UDA.js.map +0 -1
  112. package/dist/audit-N2CRHWUN.js.map +0 -1
  113. package/dist/auth-XGSTT5G5.js.map +0 -1
  114. package/dist/bundle-F43TD2BQ.js +0 -218
  115. package/dist/bundle-F43TD2BQ.js.map +0 -1
  116. package/dist/cache-SLNFRTI2.js.map +0 -1
  117. package/dist/changelog-OYUZOCOL.js +0 -53
  118. package/dist/changelog-OYUZOCOL.js.map +0 -1
  119. package/dist/chunk-4O4D5SGL.js.map +0 -1
  120. package/dist/chunk-AA577WVQ.js.map +0 -1
  121. package/dist/chunk-FWKYRLKY.js +0 -19
  122. package/dist/chunk-FWKYRLKY.js.map +0 -1
  123. package/dist/chunk-NV75I5VP.js.map +0 -1
  124. package/dist/chunk-U6ZTQ34I.js.map +0 -1
  125. package/dist/config-222P3MKK.js.map +0 -1
  126. package/dist/data-safety-Q7FTCEWU.js.map +0 -1
  127. package/dist/device-tiers-MIOQEXYY.js.map +0 -1
  128. package/dist/diff-V77SMKAQ.js +0 -96
  129. package/dist/diff-V77SMKAQ.js.map +0 -1
  130. package/dist/docs-7DUXIKA3.js.map +0 -1
  131. package/dist/doctor-3Z4ARPM2.js +0 -372
  132. package/dist/doctor-3Z4ARPM2.js.map +0 -1
  133. package/dist/enterprise-7THXNBTC.js.map +0 -1
  134. package/dist/external-transactions-2GWIMUVM.js.map +0 -1
  135. package/dist/games-BT777WUO.js.map +0 -1
  136. package/dist/generated-apks-RJWTIX7L.js.map +0 -1
  137. package/dist/grants-TKQJ3IER.js.map +0 -1
  138. package/dist/iap-ICAEQLK5.js.map +0 -1
  139. package/dist/init-JZ2THPMS.js.map +0 -1
  140. package/dist/listings-77HZW4S5.js.map +0 -1
  141. package/dist/migrate-SQT6RD6T.js +0 -143
  142. package/dist/migrate-SQT6RD6T.js.map +0 -1
  143. package/dist/one-time-products-LHZAXQES.js.map +0 -1
  144. package/dist/preflight-H3HEBYQW.js.map +0 -1
  145. package/dist/publish-Q5ZKEKZ5.js.map +0 -1
  146. package/dist/purchase-options-CKRN4VIW.js.map +0 -1
  147. package/dist/purchases-HSMCOG4A.js +0 -330
  148. package/dist/purchases-HSMCOG4A.js.map +0 -1
  149. package/dist/quickstart-4HB62YEL.js.map +0 -1
  150. package/dist/quota-UHIQQYOY.js.map +0 -1
  151. package/dist/recovery-5EV2R476.js.map +0 -1
  152. package/dist/releases-C2WC2K4E.js.map +0 -1
  153. package/dist/reports-2YX3RDOS.js.map +0 -1
  154. package/dist/reviews-2CWOI5CV.js +0 -213
  155. package/dist/reviews-2CWOI5CV.js.map +0 -1
  156. package/dist/status-WHGLODGV.js.map +0 -1
  157. package/dist/subscriptions-CI3JH3VQ.js.map +0 -1
  158. package/dist/testers-NZOFA3EF.js.map +0 -1
  159. package/dist/tracks-NERFFEDT.js +0 -107
  160. package/dist/tracks-NERFFEDT.js.map +0 -1
  161. package/dist/train-XKE4JN3Y.js.map +0 -1
  162. package/dist/update-QMPRL5Y6.js.map +0 -1
  163. package/dist/users-2YTC4Q36.js.map +0 -1
  164. package/dist/validate-UOVTM6L3.js.map +0 -1
  165. package/dist/vitals-A4CS4MSS.js.map +0 -1
  166. /package/dist/{feedback-2W2XJGZX.js.map → feedback-XP765TOO.js.map} +0 -0
  167. /package/dist/{prompt-BSV22CQZ.js.map → prompt-GXC2JSLA.js.map} +0 -0
  168. /package/dist/{version-NK5SJLHJ.js.map → version-NCSNXNVN.js.map} +0 -0
@@ -8,7 +8,7 @@ import {
8
8
  } from "./chunk-ELXAK7GI.js";
9
9
  import {
10
10
  requireConfirm
11
- } from "./chunk-NV75I5VP.js";
11
+ } from "./chunk-YFUBD2XB.js";
12
12
 
13
13
  // src/commands/users.ts
14
14
  import { loadConfig } from "@gpc-cli/config";
@@ -23,15 +23,18 @@ import {
23
23
  parseGrantArg,
24
24
  PERMISSION_PROPAGATION_WARNING,
25
25
  formatOutput,
26
- sortResults
26
+ sortResults,
27
+ GpcError
27
28
  } from "@gpc-cli/core";
28
29
  function resolveDeveloperId(devIdArg, config) {
29
30
  const id = devIdArg || config.developerId;
30
31
  if (!id) {
31
- console.error(
32
- "Error: No developer ID. Use --developer-id <id> or gpc config set developerId <id>"
32
+ throw new GpcError(
33
+ "No developer ID. Use --developer-id <id> or gpc config set developerId <id>",
34
+ "MISSING_DEVELOPER_ID",
35
+ 2,
36
+ "gpc config set developerId <id>"
33
37
  );
34
- process.exit(2);
35
38
  }
36
39
  return id;
37
40
  }
@@ -46,34 +49,29 @@ function registerUsersCommands(program) {
46
49
  const developerId = resolveDeveloperId(users.opts()["developerId"], config);
47
50
  const client = await getUsersClient(config);
48
51
  const format = getOutputFormat(program, config);
49
- try {
50
- const result = await listUsers(client, developerId, {
51
- limit: options.limit,
52
- nextPage: options.nextPage
53
- });
54
- if (options.sort) {
55
- result.users = sortResults(result.users, options.sort);
56
- }
57
- if (format !== "json") {
58
- const users2 = result.users || [];
59
- if (users2.length === 0) {
60
- console.log("No users found.");
61
- } else {
62
- const rows = users2.map((u) => ({
63
- email: u["email"] || "-",
64
- name: u["name"] || "-",
65
- accessState: u["accessState"] || "-",
66
- grants: Array.isArray(u["grants"]) ? u["grants"].length : 0,
67
- permissions: Array.isArray(u["developerAccountPermission"]) ? u["developerAccountPermission"].length : 0
68
- }));
69
- console.log(formatOutput(rows, format));
70
- }
52
+ const result = await listUsers(client, developerId, {
53
+ limit: options.limit,
54
+ nextPage: options.nextPage
55
+ });
56
+ if (options.sort) {
57
+ result.users = sortResults(result.users, options.sort);
58
+ }
59
+ if (format !== "json") {
60
+ const users2 = result.users || [];
61
+ if (users2.length === 0) {
62
+ console.log("No users found.");
71
63
  } else {
72
- console.log(formatOutput(result, format));
64
+ const rows = users2.map((u) => ({
65
+ email: u["email"] || "-",
66
+ name: u["name"] || "-",
67
+ accessState: u["accessState"] || "-",
68
+ grants: Array.isArray(u["grants"]) ? u["grants"].length : 0,
69
+ permissions: Array.isArray(u["developerAccountPermission"]) ? u["developerAccountPermission"].length : 0
70
+ }));
71
+ console.log(formatOutput(rows, format));
73
72
  }
74
- } catch (error) {
75
- console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);
76
- process.exit(4);
73
+ } else {
74
+ console.log(formatOutput(result, format));
77
75
  }
78
76
  });
79
77
  users.command("get <email>").description("Get user details").action(async (email) => {
@@ -81,13 +79,8 @@ function registerUsersCommands(program) {
81
79
  const developerId = resolveDeveloperId(users.opts()["developerId"], config);
82
80
  const client = await getUsersClient(config);
83
81
  const format = getOutputFormat(program, config);
84
- try {
85
- const result = await getUser(client, developerId, email);
86
- console.log(formatOutput(result, format));
87
- } catch (error) {
88
- console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);
89
- process.exit(4);
90
- }
82
+ const result = await getUser(client, developerId, email);
83
+ console.log(formatOutput(result, format));
91
84
  });
92
85
  users.command("invite <email>").description("Invite a user to the developer account").option("--role <permissions...>", "Developer-level permissions").option(
93
86
  "--grant <grants...>",
@@ -110,16 +103,11 @@ function registerUsersCommands(program) {
110
103
  return;
111
104
  }
112
105
  const client = await getUsersClient(config);
113
- try {
114
- const permissions = options.role;
115
- const grants = options.grant?.map((g) => parseGrantArg(g));
116
- const result = await inviteUser(client, developerId, email, permissions, grants);
117
- console.log(formatOutput(result, format));
118
- console.error(PERMISSION_PROPAGATION_WARNING);
119
- } catch (error) {
120
- console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);
121
- process.exit(4);
122
- }
106
+ const permissions = options.role;
107
+ const grants = options.grant?.map((g) => parseGrantArg(g));
108
+ const result = await inviteUser(client, developerId, email, permissions, grants);
109
+ console.log(formatOutput(result, format));
110
+ console.error(PERMISSION_PROPAGATION_WARNING);
123
111
  });
124
112
  users.command("update <email>").description("Update user permissions").option("--role <permissions...>", "Developer-level permissions").option(
125
113
  "--grant <grants...>",
@@ -142,16 +130,11 @@ function registerUsersCommands(program) {
142
130
  return;
143
131
  }
144
132
  const client = await getUsersClient(config);
145
- try {
146
- const permissions = options.role;
147
- const grants = options.grant?.map((g) => parseGrantArg(g));
148
- const result = await updateUser(client, developerId, email, permissions, grants);
149
- console.log(formatOutput(result, format));
150
- console.error(PERMISSION_PROPAGATION_WARNING);
151
- } catch (error) {
152
- console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);
153
- process.exit(4);
154
- }
133
+ const permissions = options.role;
134
+ const grants = options.grant?.map((g) => parseGrantArg(g));
135
+ const result = await updateUser(client, developerId, email, permissions, grants);
136
+ console.log(formatOutput(result, format));
137
+ console.error(PERMISSION_PROPAGATION_WARNING);
155
138
  });
156
139
  users.command("remove <email>").description("Remove a user from the developer account").action(async (email) => {
157
140
  const config = await loadConfig();
@@ -171,17 +154,12 @@ function registerUsersCommands(program) {
171
154
  return;
172
155
  }
173
156
  const client = await getUsersClient(config);
174
- try {
175
- await removeUser(client, developerId, email);
176
- console.log(`User ${email} removed.`);
177
- console.error(PERMISSION_PROPAGATION_WARNING);
178
- } catch (error) {
179
- console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);
180
- process.exit(4);
181
- }
157
+ await removeUser(client, developerId, email);
158
+ console.log(`User ${email} removed.`);
159
+ console.error(PERMISSION_PROPAGATION_WARNING);
182
160
  });
183
161
  }
184
162
  export {
185
163
  registerUsersCommands
186
164
  };
187
- //# sourceMappingURL=users-2YTC4Q36.js.map
165
+ //# sourceMappingURL=users-UKG7VIQH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/users.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 { createUsersClient } from \"@gpc-cli/api\";\nimport type { DeveloperPermission } from \"@gpc-cli/api\";\nimport {\n listUsers,\n getUser,\n inviteUser,\n updateUser,\n removeUser,\n parseGrantArg,\n PERMISSION_PROPAGATION_WARNING,\n formatOutput,\n sortResults,\n GpcError,\n} from \"@gpc-cli/core\";\nimport { getOutputFormat } from \"../format.js\";\nimport { isDryRun, printDryRun } from \"../dry-run.js\";\nimport { requireConfirm } from \"../prompt.js\";\n\nfunction resolveDeveloperId(devIdArg: string | undefined, config: GpcConfig): string {\n const id = devIdArg || config.developerId;\n if (!id) {\n throw new GpcError(\n \"No developer ID. Use --developer-id <id> or gpc config set developerId <id>\",\n \"MISSING_DEVELOPER_ID\",\n 2,\n \"gpc config set developerId <id>\",\n );\n }\n return id;\n}\n\nasync function getUsersClient(config: GpcConfig) {\n const auth = await resolveAuth({ serviceAccountPath: config.auth?.serviceAccount });\n return createUsersClient({ auth });\n}\n\nexport function registerUsersCommands(program: Command): void {\n const users = program\n .command(\"users\")\n .description(\"Manage developer account users and permissions\")\n .option(\"--developer-id <id>\", \"Developer account ID\");\n\n users\n .command(\"list\")\n .description(\"List all users in the developer account\")\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 developerId = resolveDeveloperId(users.opts()[\"developerId\"], config);\n const client = await getUsersClient(config);\n const format = getOutputFormat(program, config);\n\n const result = await listUsers(client, developerId, {\n limit: options.limit,\n nextPage: options.nextPage,\n });\n if (options.sort) {\n result.users = sortResults(result.users, options.sort);\n }\n if (format !== \"json\") {\n const users = (result.users || []) as unknown as Record<string, unknown>[];\n if (users.length === 0) {\n console.log(\"No users found.\");\n } else {\n const rows = users.map((u) => ({\n email: u[\"email\"] || \"-\",\n name: u[\"name\"] || \"-\",\n accessState: u[\"accessState\"] || \"-\",\n grants: Array.isArray(u[\"grants\"]) ? (u[\"grants\"] as unknown[]).length : 0,\n permissions: Array.isArray(u[\"developerAccountPermission\"])\n ? (u[\"developerAccountPermission\"] as unknown[]).length\n : 0,\n }));\n console.log(formatOutput(rows, format));\n }\n } else {\n console.log(formatOutput(result, format));\n }\n });\n\n users\n .command(\"get <email>\")\n .description(\"Get user details\")\n .action(async (email: string) => {\n const config = await loadConfig();\n const developerId = resolveDeveloperId(users.opts()[\"developerId\"], config);\n const client = await getUsersClient(config);\n const format = getOutputFormat(program, config);\n\n const result = await getUser(client, developerId, email);\n console.log(formatOutput(result, format));\n });\n\n users\n .command(\"invite <email>\")\n .description(\"Invite a user to the developer account\")\n .option(\"--role <permissions...>\", \"Developer-level permissions\")\n .option(\n \"--grant <grants...>\",\n \"Per-app grants (format: com.example.app:PERMISSION1,PERMISSION2)\",\n )\n .action(async (email: string, options) => {\n const config = await loadConfig();\n const developerId = resolveDeveloperId(users.opts()[\"developerId\"], config);\n const format = getOutputFormat(program, config);\n\n if (isDryRun(program)) {\n printDryRun(\n {\n command: \"users invite\",\n action: \"invite\",\n target: email,\n details: { role: options.role, grant: options.grant },\n },\n format,\n formatOutput,\n );\n return;\n }\n\n const client = await getUsersClient(config);\n\n const permissions = options.role as DeveloperPermission[] | undefined;\n const grants = options.grant?.map((g: string) => parseGrantArg(g));\n const result = await inviteUser(client, developerId, email, permissions, grants);\n console.log(formatOutput(result, format));\n console.error(PERMISSION_PROPAGATION_WARNING);\n });\n\n users\n .command(\"update <email>\")\n .description(\"Update user permissions\")\n .option(\"--role <permissions...>\", \"Developer-level permissions\")\n .option(\n \"--grant <grants...>\",\n \"Per-app grants (format: com.example.app:PERMISSION1,PERMISSION2)\",\n )\n .action(async (email: string, options) => {\n const config = await loadConfig();\n const developerId = resolveDeveloperId(users.opts()[\"developerId\"], config);\n const format = getOutputFormat(program, config);\n\n if (isDryRun(program)) {\n printDryRun(\n {\n command: \"users update\",\n action: \"update\",\n target: email,\n details: { role: options.role, grant: options.grant },\n },\n format,\n formatOutput,\n );\n return;\n }\n\n const client = await getUsersClient(config);\n\n const permissions = options.role as DeveloperPermission[] | undefined;\n const grants = options.grant?.map((g: string) => parseGrantArg(g));\n const result = await updateUser(client, developerId, email, permissions, grants);\n console.log(formatOutput(result, format));\n console.error(PERMISSION_PROPAGATION_WARNING);\n });\n\n users\n .command(\"remove <email>\")\n .description(\"Remove a user from the developer account\")\n .action(async (email: string) => {\n const config = await loadConfig();\n const developerId = resolveDeveloperId(users.opts()[\"developerId\"], config);\n\n await requireConfirm(`Remove user \"${email}\" from developer account?`, program);\n\n if (isDryRun(program)) {\n const format = getOutputFormat(program, config);\n printDryRun(\n {\n command: \"users remove\",\n action: \"remove\",\n target: email,\n },\n format,\n formatOutput,\n );\n return;\n }\n\n const client = await getUsersClient(config);\n\n await removeUser(client, developerId, email);\n console.log(`User ${email} removed.`);\n console.error(PERMISSION_PROPAGATION_WARNING);\n });\n}\n"],"mappings":"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","names":["users"]}
@@ -15,19 +15,15 @@ import { formatOutput } from "@gpc-cli/core";
15
15
  function registerValidateCommand(program) {
16
16
  program.command("validate <file>").description("Pre-submission validation checks").option("--track <track>", "Target track to validate").option("--mapping <file>", "ProGuard/R8 mapping file").option("--notes <text>", "Release notes (en-US)").option("--notes-dir <dir>", "Read release notes from directory (<dir>/<lang>.txt)").action(async (file, options) => {
17
17
  if (options.notes && options.notesDir) {
18
- console.error("Error: Cannot use both --notes and --notes-dir");
19
- process.exit(2);
18
+ const err = new Error("Cannot use both --notes and --notes-dir");
19
+ Object.assign(err, { code: "USAGE_ERROR", exitCode: 2, suggestion: "Use either --notes or --notes-dir, not both." });
20
+ throw err;
20
21
  }
21
22
  const config = await loadConfig();
22
23
  const format = getOutputFormat(program, config);
23
24
  let notes;
24
25
  if (options.notesDir) {
25
- try {
26
- notes = await readReleaseNotesFromDir(options.notesDir);
27
- } catch (err) {
28
- console.error(`Error: ${err instanceof Error ? err.message : String(err)}`);
29
- process.exit(1);
30
- }
26
+ notes = await readReleaseNotesFromDir(options.notesDir);
31
27
  } else if (options.notes) {
32
28
  notes = [{ language: "en-US", text: options.notes }];
33
29
  }
@@ -55,10 +51,12 @@ function registerValidateCommand(program) {
55
51
  console.log(`
56
52
  ${result.valid ? green("\u2713 Valid") : red("\u2717 Invalid")}`);
57
53
  }
58
- process.exit(result.valid ? 0 : 1);
54
+ if (!result.valid) {
55
+ process.exitCode = 1;
56
+ }
59
57
  });
60
58
  }
61
59
  export {
62
60
  registerValidateCommand
63
61
  };
64
- //# sourceMappingURL=validate-UOVTM6L3.js.map
62
+ //# sourceMappingURL=validate-QIYSA3N7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/validate.ts"],"sourcesContent":["import type { Command } from \"commander\";\nimport { loadConfig } from \"@gpc-cli/config\";\nimport { validatePreSubmission, readReleaseNotesFromDir } from \"@gpc-cli/core\";\nimport { formatOutput } from \"@gpc-cli/core\";\nimport { getOutputFormat } from \"../format.js\";\nimport { green, red, yellow } from \"../colors.js\";\n\nexport function registerValidateCommand(program: Command): void {\n program\n .command(\"validate <file>\")\n .description(\"Pre-submission validation checks\")\n .option(\"--track <track>\", \"Target track to validate\")\n .option(\"--mapping <file>\", \"ProGuard/R8 mapping file\")\n .option(\"--notes <text>\", \"Release notes (en-US)\")\n .option(\"--notes-dir <dir>\", \"Read release notes from directory (<dir>/<lang>.txt)\")\n .action(async (file: string, options) => {\n if (options.notes && options.notesDir) {\n const err = new Error(\"Cannot use both --notes and --notes-dir\");\n Object.assign(err, { code: \"USAGE_ERROR\", exitCode: 2, suggestion: \"Use either --notes or --notes-dir, not both.\" });\n throw err;\n }\n\n const config = await loadConfig();\n const format = getOutputFormat(program, config);\n\n let notes: { language: string; text: string }[] | undefined;\n if (options.notesDir) {\n notes = await readReleaseNotesFromDir(options.notesDir);\n } else if (options.notes) {\n notes = [{ language: \"en-US\", text: options.notes }];\n }\n\n const result = await validatePreSubmission({\n filePath: file,\n mappingFile: options.mapping,\n track: options.track,\n notes,\n });\n\n if (format === \"json\") {\n console.log(formatOutput(result, format));\n } else {\n const checkRows = result.checks.map((c) => ({\n check: c.name,\n passed: c.passed ? green(\"✓ pass\") : red(\"✗ FAIL\"),\n message: c.message,\n }));\n console.log(formatOutput(checkRows, format));\n if (result.warnings.length > 0) {\n console.log(\"\\nWarnings:\");\n for (const w of result.warnings) {\n console.log(` ${yellow(\"⚠\")} ${w}`);\n }\n }\n console.log(`\\n${result.valid ? green(\"✓ Valid\") : red(\"✗ Invalid\")}`);\n }\n if (!result.valid) {\n process.exitCode = 1;\n }\n });\n}\n"],"mappings":";;;;;;;;;;;AACA,SAAS,kBAAkB;AAC3B,SAAS,uBAAuB,+BAA+B;AAC/D,SAAS,oBAAoB;AAItB,SAAS,wBAAwB,SAAwB;AAC9D,UACG,QAAQ,iBAAiB,EACzB,YAAY,kCAAkC,EAC9C,OAAO,mBAAmB,0BAA0B,EACpD,OAAO,oBAAoB,0BAA0B,EACrD,OAAO,kBAAkB,uBAAuB,EAChD,OAAO,qBAAqB,sDAAsD,EAClF,OAAO,OAAO,MAAc,YAAY;AACvC,QAAI,QAAQ,SAAS,QAAQ,UAAU;AACrC,YAAM,MAAM,IAAI,MAAM,yCAAyC;AAC/D,aAAO,OAAO,KAAK,EAAE,MAAM,eAAe,UAAU,GAAG,YAAY,+CAA+C,CAAC;AACnH,YAAM;AAAA,IACR;AAEA,UAAM,SAAS,MAAM,WAAW;AAChC,UAAM,SAAS,gBAAgB,SAAS,MAAM;AAE9C,QAAI;AACJ,QAAI,QAAQ,UAAU;AACpB,cAAQ,MAAM,wBAAwB,QAAQ,QAAQ;AAAA,IACxD,WAAW,QAAQ,OAAO;AACxB,cAAQ,CAAC,EAAE,UAAU,SAAS,MAAM,QAAQ,MAAM,CAAC;AAAA,IACrD;AAEA,UAAM,SAAS,MAAM,sBAAsB;AAAA,MACzC,UAAU;AAAA,MACV,aAAa,QAAQ;AAAA,MACrB,OAAO,QAAQ;AAAA,MACf;AAAA,IACF,CAAC;AAED,QAAI,WAAW,QAAQ;AACrB,cAAQ,IAAI,aAAa,QAAQ,MAAM,CAAC;AAAA,IAC1C,OAAO;AACL,YAAM,YAAY,OAAO,OAAO,IAAI,CAAC,OAAO;AAAA,QAC1C,OAAO,EAAE;AAAA,QACT,QAAQ,EAAE,SAAS,MAAM,aAAQ,IAAI,IAAI,aAAQ;AAAA,QACjD,SAAS,EAAE;AAAA,MACb,EAAE;AACF,cAAQ,IAAI,aAAa,WAAW,MAAM,CAAC;AAC3C,UAAI,OAAO,SAAS,SAAS,GAAG;AAC9B,gBAAQ,IAAI,aAAa;AACzB,mBAAW,KAAK,OAAO,UAAU;AAC/B,kBAAQ,IAAI,KAAK,OAAO,QAAG,CAAC,IAAI,CAAC,EAAE;AAAA,QACrC;AAAA,MACF;AACA,cAAQ,IAAI;AAAA,EAAK,OAAO,QAAQ,MAAM,cAAS,IAAI,IAAI,gBAAW,CAAC,EAAE;AAAA,IACvE;AACA,QAAI,CAAC,OAAO,OAAO;AACjB,cAAQ,WAAW;AAAA,IACrB;AAAA,EACF,CAAC;AACL;","names":[]}
@@ -1,13 +1,13 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  detectInstallMethod
4
- } from "./chunk-U6ZTQ34I.js";
5
- import "./chunk-4O4D5SGL.js";
4
+ } from "./chunk-BCBXQC7J.js";
5
+ import "./chunk-3SJ6OXCZ.js";
6
6
 
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.44";
10
+ const version = "0.9.45";
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-NK5SJLHJ.js.map
28
+ //# sourceMappingURL=version-NCSNXNVN.js.map