shipthis 0.1.33 → 0.1.35

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 (105) hide show
  1. package/README.md +8 -7
  2. package/assets/markdown/{android-success.md → android-success.md.ejs} +2 -2
  3. package/assets/markdown/apikey-create.md.ejs +11 -0
  4. package/assets/markdown/{create-google-play-game.md → create-google-play-game.md.ejs} +2 -2
  5. package/assets/markdown/{invite-service-account.md → invite-service-account.md.ejs} +1 -1
  6. package/assets/markdown/{ios-success.md → ios-success.md.ejs} +2 -2
  7. package/assets/markdown/{privacy-notification.md → privacy-notification.md.ejs} +1 -1
  8. package/assets/markdown/service-account-policy-wizard.md.ejs +26 -0
  9. package/assets/markdown/service-account-policy.md.ejs +30 -0
  10. package/assets/markdown/{ship-failure.md → ship-failure.md.ejs} +1 -1
  11. package/assets/markdown/{ship-success.md → ship-success.md.ejs} +2 -2
  12. package/dist/{AppleBundleIdDetails-BhHPCvRm.js → AppleBundleIdDetails-N_j1wv6f.js} +5 -4
  13. package/dist/{Command-BDIkuv2g.js → Command-DN1j3tjt.js} +2 -2
  14. package/dist/{CommandGame-CvBIjPZp.js → CommandGame-D2NqytWc.js} +2 -2
  15. package/dist/{Create-Lpe0B8nT.js → Create-BRdv5jXQ.js} +5 -4
  16. package/dist/{GameStatus-5XpufIY_.js → GameStatus-joyHPy0f.js} +12 -17
  17. package/dist/{Import-DFzrAG04.js → Import-BNMHsJoM.js} +5 -4
  18. package/dist/{JobLogTail-BYcJgPcL.js → JobLogTail-D35FO5v-.js} +5 -5
  19. package/dist/{JobProgress-BcrE7CUK.js → JobProgress-D-9KESaA.js} +6 -5
  20. package/dist/{JobStatusTable-Bi-y8ZZT.js → JobStatusTable-DIJ_h-gi.js} +4 -4
  21. package/dist/{ProjectCredentialsTable-B4vDJl4l.js → ProjectCredentialsTable-BMKgv99h.js} +2 -2
  22. package/dist/{RunWithSpinner-gMVA07bZ.js → RunWithSpinner-DucRnFp6.js} +2 -1
  23. package/dist/{UserCredentialsTable-CwkZTFBD.js → UserCredentialsTable-CUrTDzTK.js} +10 -10
  24. package/dist/{baseAppleCommand-BKXweb-U.js → baseAppleCommand-Cs9a52e5.js} +1 -1
  25. package/dist/{baseGameAndroidCommand-CAi-BSsH.js → baseGameAndroidCommand-BCB1SMCf.js} +2 -2
  26. package/dist/commands/apiKey/create.js +100 -0
  27. package/dist/commands/apiKey/list.js +94 -0
  28. package/dist/commands/apiKey/revoke.js +85 -0
  29. package/dist/commands/apple/apiKey/create.js +12 -9
  30. package/dist/commands/apple/apiKey/export.js +11 -8
  31. package/dist/commands/apple/apiKey/import.js +11 -8
  32. package/dist/commands/apple/apiKey/status.js +16 -13
  33. package/dist/commands/apple/certificate/create.js +12 -9
  34. package/dist/commands/apple/certificate/export.js +11 -8
  35. package/dist/commands/apple/certificate/import.js +11 -8
  36. package/dist/commands/apple/certificate/status.js +16 -13
  37. package/dist/commands/apple/login.js +2 -2
  38. package/dist/commands/apple/status.js +8 -5
  39. package/dist/commands/dashboard.js +1 -1
  40. package/dist/commands/game/android/apiKey/connect.js +13 -9
  41. package/dist/commands/game/android/apiKey/create.js +15 -11
  42. package/dist/commands/game/android/apiKey/export.js +12 -9
  43. package/dist/commands/game/android/apiKey/import.js +12 -9
  44. package/dist/commands/game/android/apiKey/invite.js +4 -4
  45. package/dist/commands/game/android/apiKey/policy.js +87 -0
  46. package/dist/commands/game/android/apiKey/status.js +11 -8
  47. package/dist/commands/game/android/keyStore/create.js +13 -10
  48. package/dist/commands/game/android/keyStore/export.js +11 -8
  49. package/dist/commands/game/android/keyStore/import.js +13 -10
  50. package/dist/commands/game/android/keyStore/status.js +10 -7
  51. package/dist/commands/game/android/status.js +1 -1
  52. package/dist/commands/game/build/download.js +9 -6
  53. package/dist/commands/game/build/list.js +9 -6
  54. package/dist/commands/game/create.js +2 -2
  55. package/dist/commands/game/details.js +8 -5
  56. package/dist/commands/game/export.js +1 -1
  57. package/dist/commands/game/ios/app/addTester.js +16 -13
  58. package/dist/commands/game/ios/app/create.js +9 -6
  59. package/dist/commands/game/ios/app/status.js +11 -8
  60. package/dist/commands/game/ios/app/sync.js +10 -7
  61. package/dist/commands/game/ios/profile/create.js +12 -9
  62. package/dist/commands/game/ios/profile/export.js +11 -8
  63. package/dist/commands/game/ios/profile/import.js +11 -8
  64. package/dist/commands/game/ios/profile/status.js +10 -7
  65. package/dist/commands/game/ios/status.js +13 -10
  66. package/dist/commands/game/ios/wizard.js +9 -6
  67. package/dist/commands/game/job/list.js +8 -5
  68. package/dist/commands/game/job/status.js +11 -8
  69. package/dist/commands/game/list.js +15 -10
  70. package/dist/commands/game/ship.js +15 -12
  71. package/dist/commands/game/status.js +10 -7
  72. package/dist/commands/game/wizard.js +24 -20
  73. package/dist/commands/internal/fastlane.js +1 -1
  74. package/dist/commands/internal/readme.js +4 -715
  75. package/dist/commands/login.js +2 -2
  76. package/dist/commands/status.js +14 -14
  77. package/dist/ejs-DirFZbza.js +716 -0
  78. package/dist/{export-DLQrUEBK.js → export-DFCZKNQk.js} +1 -1
  79. package/dist/{import-BoY5e0uJ.js → import-BpGyif-m.js} +1 -1
  80. package/dist/{index-CisLwc7e.js → index-BTXEUd8W.js} +59 -16
  81. package/dist/{index-pj8JVg5X.js → index-BwnzoldS.js} +37 -2
  82. package/dist/{index-B27WJDxn.js → index-CJWMt1s-.js} +1 -1
  83. package/dist/{index-DC0GJtAy.js → index-DlE_SPt3.js} +7 -11
  84. package/dist/{index-DfUg5j06.js → index-hoHfGrjg.js} +33 -33
  85. package/dist/{index-Crv7S0bl.js → index-izrACZbC.js} +1 -1
  86. package/dist/{upload-C8S17EU_.js → upload-D19OQsbn.js} +1 -1
  87. package/dist/{useAndroidServiceAccountTestResult-D4e5AKAZ.js → useAndroidServiceAccountTestResult-CwKeW0ED.js} +1 -1
  88. package/dist/{useAppleApp-Dr6URQvC.js → useAppleApp-BZc_cNa-.js} +1 -1
  89. package/dist/{useAppleBundleId-DELAwSQp.js → useAppleBundleId-DvMXAvWD.js} +1 -1
  90. package/dist/useGoogleStatus-Cx_QIsXa.js +10 -0
  91. package/dist/{useProjectCredentials-BjvdJdQg.js → useProjectCredentials-DxdwJCfU.js} +14 -11
  92. package/dist/{useWebSocket-CRV7V69Q.js → useWebSocket-cM5yOcDv.js} +1 -1
  93. package/docs/README.md +3 -2
  94. package/docs/apiKey/create.md +27 -0
  95. package/docs/apiKey/list.md +30 -0
  96. package/docs/apiKey/revoke.md +26 -0
  97. package/docs/apiKey.md +103 -0
  98. package/docs/game/android/apiKey/policy.md +28 -0
  99. package/docs/game/android/keyStore.md +14 -4
  100. package/docs/game/android/status.md +4 -0
  101. package/docs/game/android.md +9 -305
  102. package/docs/game/ship.md +43 -11
  103. package/docs/game.md +7 -1
  104. package/package.json +11 -3
  105. /package/assets/markdown/{create-or-import-keystore.md → create-or-import-keystore.md.ejs} +0 -0
package/README.md CHANGED
@@ -199,18 +199,19 @@ ShipThis is currently in open-beta as so it is completely free to use. You can s
199
199
 
200
200
  ### 🗂 Topics
201
201
 
202
- - [apple](https://shipth.is/docs/reference/apple) Commands that relate to linking your ShipThis account with your Apple Developer Account
203
- - [game](https://shipth.is/docs/reference/game) Commands that relate to configuring the specific game in the current working directory.
202
+ - [apiKey](https://shipth.is/docs/reference/apiKey) - Commands related to ShipThis API Keys
203
+ - [apple](https://shipth.is/docs/reference/apple) - Commands that relate to linking your ShipThis account with your Apple Developer Account
204
+ - [game](https://shipth.is/docs/reference/game) - Commands that relate to configuring the specific game in the current working directory.
204
205
 
205
206
  ### 🔧 Commands
206
207
 
207
- - [dashboard](https://shipth.is/docs/reference/dashboard) Opens the web browser to your shipth.is dashboard
208
- - [login](https://shipth.is/docs/reference/login) Sign in or create a new account
209
- - [status](https://shipth.is/docs/reference/status) Display your overall ShipThis account status
210
- - [help](https://shipth.is/docs/reference/help) Display help for a specific topic or command
208
+ - [dashboard](https://shipth.is/docs/reference/dashboard) - Opens the web browser to your shipth.is dashboard
209
+ - [login](https://shipth.is/docs/reference/login) - Sign in or create a new account
210
+ - [status](https://shipth.is/docs/reference/status) - Display your overall ShipThis account status
211
+ - [help](https://shipth.is/docs/reference/help) - Display help for a specific topic or command
211
212
 
212
213
  ## 🌍 Community
213
214
 
214
215
  - 💬 [Join us on Discord](https://discord.gg/gPjn3S99k4)
215
216
  - 🐛 [Report an issue](https://github.com/shipth-is/cli/issues)
216
- - 📣 Feature ideas? Feedback? We’d love to hear from you email support@shipth.is
217
+ - 📣 Feature ideas? Feedback? We’d love to hear from you - email support@shipth.is
@@ -8,8 +8,8 @@ shipthis game ship
8
8
 
9
9
  ## 🚀 Next Steps
10
10
 
11
- - Check out the **iOS set up guide** [${iosSetupURL}](${iosSetupURL})
12
- - Review the **ShipThis Documentation** [${docsURL}](${docsURL})
11
+ - Check out the **iOS set up guide** [<%= iosSetupURL %>](<%= iosSetupURL %>)
12
+ - Review the **ShipThis Documentation** [<%= docsURL %>](<%= docsURL %>)
13
13
 
14
14
  ### Need help?
15
15
 
@@ -0,0 +1,11 @@
1
+ # Your ShipThis API Key has been created
2
+
3
+ - ID: **<%= keyId %>**
4
+ - Name: **<%= keyName %>**
5
+ - Expiry: **<%= keyExpiry %>**
6
+
7
+ **The secret will not be shown again. Store it securely.**
8
+
9
+ ## Secret value
10
+
11
+ <%= keySecret %>
@@ -12,7 +12,7 @@ You will need to manually create an "app" in Google Play.
12
12
  To download the AAB file from the previous step, please run:
13
13
 
14
14
  ```bash
15
- ${downloadCmd}
15
+ <%= downloadCmd %>
16
16
  ```
17
17
 
18
- The build is also available for download from your **ShipThis Dashboard** [${dashboardURL}](${dashboardURL}). **Press D to open the dashboard in your browser**
18
+ The build is also available for download from your **ShipThis Dashboard** [<%= dashboardURL %>](<%= dashboardURL %>). **Press D to open the dashboard in your browser**
@@ -4,7 +4,7 @@ Before the Service Account API Key can submit your games automatically, you will
4
4
 
5
5
  ## How To find your Google Play Account ID
6
6
 
7
- You can read our help page about this on the **ShipThis Documentation** [${guideURL}](${guideURL})
7
+ You can read our help page about this on the **ShipThis Documentation** [<%= guideURL %>](<%= guideURL %>)
8
8
 
9
9
  1. Log in to the **Google Play Console** [https://play.google.com/console](https://play.google.com/console)
10
10
  1. Below your account name there is a label **Account ID**
@@ -8,8 +8,8 @@ shipthis game ship
8
8
 
9
9
  ## 🚀 Next Steps
10
10
 
11
- - Check out the **Android set up guide** [${androidSetupURL}](${androidSetupURL})
12
- - Review the **ShipThis Documentation** [${docsURL}](${docsURL})
11
+ - Check out the **Android set up guide** [<%= androidSetupURL %>](<%= androidSetupURL %>)
12
+ - Review the **ShipThis Documentation** [<%= docsURL %>](<%= docsURL %>)
13
13
 
14
14
  ### Need help?
15
15
 
@@ -7,4 +7,4 @@ By connecting your Google account, ShipThis will generate a short-lived access t
7
7
  - Securely store your Service Account API Key in the ShipThis backend for deploying new game builds.
8
8
  - Invite the Service Account to your Google Play account.
9
9
 
10
- **To learn more about how ShipThis accesses, uses, and protects your Google data, please review our Privacy Policy [${privacyURL}](${privacyURL}).**
10
+ **To learn more about how ShipThis accesses, uses, and protects your Google data, please review our Privacy Policy [<%= privacyURL %>](<%= privacyURL %>).**
@@ -0,0 +1,26 @@
1
+ # Google Organization Policy Change Needed
2
+
3
+ | Organization | Resource | Created |
4
+ |--------------|----------|---------|
5
+ | <%= orgName %> | <%= orgResourceName %> | <%= orgCreatedAt %> |
6
+
7
+ ## What you need to do
8
+
9
+ Before ShipThis can create a Service Account API key for your game, you need to ensure that your Google Organization Policy allows Service Account key creation. This is a security measure present on some Google Organization accounts to prevent unauthorized access to resources.
10
+
11
+ If your organization was created on or after **May 3, 2024**, this policy is enforced by default and will need to be changed.
12
+
13
+ Learn more: https://cloud.google.com/resource-manager/docs/organization-policy/restricting-service-accounts?authuser=2#disable_service_account_key_creation
14
+
15
+ **ShipThis can change this policy for you. Press P to proceed and let ShipThis change the policy.**
16
+
17
+ If you would like to change this policy manually, please see:
18
+
19
+ - https://www.youtube.com/watch?v=ABIiOM9X5kM
20
+
21
+
22
+ You can re-enable the policy at any time:
23
+
24
+ ```bash
25
+ shipthis game android apiKey policy --enforce
26
+ ```
@@ -0,0 +1,30 @@
1
+ # Google Organization Policy: Disable Service Account Key Creation
2
+
3
+ **Organization:** <%= orgName %>
4
+ **Resource:** <%= orgResourceName %>
5
+ **Created:** <%= orgCreatedAt %>
6
+ **Policy Change Needed:** <%= needsPolicyChange ? 'Yes' : 'No' %>
7
+
8
+ Note: If your organization was created on or after **May 3, 2024**, this constraint is enforced by default.
9
+ Learn more: https://cloud.google.com/resource-manager/docs/organization-policy/restricting-service-accounts?authuser=2#disable_service_account_key_creation
10
+
11
+ If you would like to change this policy manually, please see:
12
+
13
+ - https://www.youtube.com/watch?v=ABIiOM9X5kM
14
+
15
+ <% if (needsPolicyChange) { %>
16
+ This organization currently **enforces** the policy that disables service account key creation.
17
+
18
+ To create an API key, you must **revoke** this policy:
19
+
20
+ ```bash
21
+ shipthis game android apiKey policy --revoke
22
+ ```
23
+
24
+ You can re-enable the policy at any time:
25
+
26
+ ```bash
27
+ shipthis game android apiKey policy --enforce
28
+ ```
29
+
30
+ <% } %>
@@ -5,7 +5,7 @@
5
5
  ## What now?
6
6
 
7
7
  - **The last 10 lines of the failed jobs are shown below**
8
- - Check out the full output in the **ShipThis Dashboard** [${jobDashboardUrl}](${jobDashboardUrl})
8
+ - Check out the full output in the **ShipThis Dashboard** [<%= jobDashboardUrl %>](<%= jobDashboardUrl %>)
9
9
 
10
10
  ### Need help?
11
11
 
@@ -1,10 +1,10 @@
1
1
  # 🚀 Shipped
2
2
 
3
- **Your game has been successfully built${if wasPublished} and published${endif}.**
3
+ **Your game has been successfully built<% if (wasPublished) { %> and published<% } %>.**
4
4
 
5
5
  ## Next Steps
6
6
 
7
- - See all builds in the **Dashboard** [${gameBuildsUrl}](${gameBuildsUrl})
7
+ - See all builds in the **Dashboard** [<%= gameBuildsUrl %>](<%= gameBuildsUrl %>)
8
8
 
9
9
  ### Need help?
10
10
 
@@ -11,13 +11,13 @@ import 'readline-sync';
11
11
  import 'luxon';
12
12
  import 'axios';
13
13
  import 'isomorphic-git';
14
- import './index-pj8JVg5X.js';
14
+ import './index-BwnzoldS.js';
15
15
  import '@oclif/core';
16
16
  import '@tanstack/react-query';
17
17
  import 'react';
18
18
  import 'crypto-js';
19
19
  import 'uuid';
20
- import { u as useAppleApp } from './useAppleApp-Dr6URQvC.js';
20
+ import { u as useAppleApp } from './useAppleApp-BZc_cNa-.js';
21
21
  import 'fast-glob';
22
22
  import 'yazl';
23
23
  import 'socket.io-client';
@@ -27,11 +27,12 @@ import { T as Title } from './Title-BCQtayg6.js';
27
27
  import 'string-length';
28
28
  import 'strip-ansi';
29
29
  import 'open';
30
- import './index-DfUg5j06.js';
30
+ import './index-hoHfGrjg.js';
31
+ import './ejs-DirFZbza.js';
31
32
  import 'marked';
32
33
  import 'marked-terminal';
33
34
  import 'qrcode';
34
- import { u as useAppleBundleId } from './useAppleBundleId-DELAwSQp.js';
35
+ import { u as useAppleBundleId } from './useAppleBundleId-DvMXAvWD.js';
35
36
 
36
37
  const AppleAppDetails = (props) => {
37
38
  const { data, isLoading } = useAppleApp(props);
@@ -2,7 +2,7 @@ import { jsx } from 'react/jsx-runtime';
2
2
  import { QueryClientProvider } from '@tanstack/react-query';
3
3
  import { useScreenSize } from 'fullscreen-ink';
4
4
  import { Box } from 'ink';
5
- import { K as queryClient } from './index-pj8JVg5X.js';
5
+ import { K as queryClient } from './index-BwnzoldS.js';
6
6
  import 'axios';
7
7
  import 'node:fs';
8
8
  import 'crypto-js';
@@ -19,7 +19,7 @@ import 'react';
19
19
  import 'socket.io-client';
20
20
  import 'fast-glob';
21
21
  import 'yazl';
22
- import { b as CommandProvider } from './index-DfUg5j06.js';
22
+ import { b as CommandProvider } from './index-hoHfGrjg.js';
23
23
 
24
24
  const Command = ({ children, command }) => {
25
25
  const { width } = useScreenSize();
@@ -1,6 +1,6 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
- import { c as GameProvider } from './index-DfUg5j06.js';
3
- import { C as Command } from './Command-BDIkuv2g.js';
2
+ import { c as GameProvider } from './index-hoHfGrjg.js';
3
+ import { C as Command } from './Command-DN1j3tjt.js';
4
4
 
5
5
  const CommandGame = ({ children, command }) => /* @__PURE__ */ jsx(Command, { command, children: /* @__PURE__ */ jsx(GameProvider, { children }) });
6
6
 
@@ -3,7 +3,7 @@ import { useQueryClient } from '@tanstack/react-query';
3
3
  import axios from 'axios';
4
4
  import { Box } from 'ink';
5
5
  import { useContext } from 'react';
6
- import { p as getAuthedHeaders, o as API_URL } from './index-pj8JVg5X.js';
6
+ import { p as getAuthedHeaders, o as API_URL } from './index-BwnzoldS.js';
7
7
  import 'ink-spinner';
8
8
  import 'node:crypto';
9
9
  import 'node:fs';
@@ -14,7 +14,7 @@ import 'readline-sync';
14
14
  import 'luxon';
15
15
  import 'isomorphic-git';
16
16
  import '@oclif/core';
17
- import { c as cacheKeys } from './useAndroidServiceAccountTestResult-D4e5AKAZ.js';
17
+ import { c as cacheKeys } from './useAndroidServiceAccountTestResult-CwKeW0ED.js';
18
18
  import 'fast-glob';
19
19
  import 'uuid';
20
20
  import 'yazl';
@@ -24,11 +24,12 @@ import 'string-length';
24
24
  import 'strip-ansi';
25
25
  import 'open';
26
26
  import '@inkjs/ui';
27
+ import './ejs-DirFZbza.js';
27
28
  import 'marked';
28
29
  import 'marked-terminal';
29
30
  import 'qrcode';
30
- import { R as RunWithSpinner } from './RunWithSpinner-gMVA07bZ.js';
31
- import { G as GameContext } from './index-DfUg5j06.js';
31
+ import { R as RunWithSpinner } from './RunWithSpinner-DucRnFp6.js';
32
+ import { G as GameContext } from './index-hoHfGrjg.js';
32
33
 
33
34
  const CreateKeystore = ({ onComplete, onError, ...boxProps }) => {
34
35
  const { gameId } = useContext(GameContext);
@@ -1,9 +1,9 @@
1
1
  import { jsx, jsxs } from 'react/jsx-runtime';
2
2
  import { Text, Box } from 'ink';
3
3
  import { useState, useEffect, useContext } from 'react';
4
- import { b as getShortDate, P as Platform, E as getProject, F as getProjectPlatformProgress } from './index-pj8JVg5X.js';
4
+ import { b as getShortDate, P as Platform, E as getProject, F as getProjectPlatformProgress } from './index-BwnzoldS.js';
5
5
  import 'ink-spinner';
6
- import { g as getShortUUID, m as makeHumanReadable } from './index-B27WJDxn.js';
6
+ import { g as getShortUUID, m as makeHumanReadable } from './index-CJWMt1s-.js';
7
7
  import '@tanstack/react-query';
8
8
  import 'axios';
9
9
  import 'luxon';
@@ -19,11 +19,12 @@ import { S as StatusTable } from './StatusTable-DzRWcMr4.js';
19
19
  import 'open';
20
20
  import '@inkjs/ui';
21
21
  import 'node:path';
22
+ import './ejs-DirFZbza.js';
22
23
  import 'marked';
23
24
  import 'marked-terminal';
24
25
  import { N as NextSteps } from './NextSteps-DbJHmscQ.js';
25
26
  import 'qrcode';
26
- import { G as GameContext, C as CommandContext } from './index-DfUg5j06.js';
27
+ import { G as GameContext, C as CommandContext } from './index-hoHfGrjg.js';
27
28
 
28
29
  function isPlatformConfigured(platform, progress) {
29
30
  if (!progress) return false;
@@ -95,21 +96,15 @@ const GameStatusDetails = ({ children, gameId, onComplete, onError, platforms })
95
96
  }, []);
96
97
  if (!state) return /* @__PURE__ */ jsx(Text, {});
97
98
  const { game, statuses, steps } = state;
99
+ const gameDetails = {};
100
+ gameDetails["Game ID"] = getShortUUID(game.id);
101
+ gameDetails.Name = game.name;
102
+ gameDetails.Version = game.details?.semanticVersion || "0.0.1";
103
+ gameDetails["Build Number"] = `${game.details?.buildNumber || 1}`;
104
+ gameDetails["Created At"] = getShortDate(game.createdAt);
105
+ gameDetails["Game Engine"] = `${game.details?.gameEngine || "godot"} ${game.details?.gameEngineVersion || "4.3"}`;
98
106
  return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", children: [
99
- /* @__PURE__ */ jsx(
100
- StatusTable,
101
- {
102
- statuses: {
103
- "Build Number": `${game.details?.buildNumber || 1}`,
104
- "Created At": getShortDate(game.createdAt),
105
- "Game Engine": `${game.details?.gameEngine || "godot"} ${game.details?.gameEngineVersion || "4.3"}`,
106
- "Game ID": getShortUUID(game.id),
107
- Name: game.name,
108
- Version: game.details?.semanticVersion || "0.0.1"
109
- },
110
- title: "Game Details"
111
- }
112
- ),
107
+ /* @__PURE__ */ jsx(StatusTable, { statuses: gameDetails, title: "Game Details" }),
113
108
  platforms.map((platform) => {
114
109
  const status = statuses[platform];
115
110
  const label = platform === Platform.IOS ? "iOS" : "Android";
@@ -11,7 +11,7 @@ import 'readline-sync';
11
11
  import 'luxon';
12
12
  import 'axios';
13
13
  import 'isomorphic-git';
14
- import { K as queryClient, P as Platform, C as CredentialsType } from './index-pj8JVg5X.js';
14
+ import { K as queryClient, P as Platform, C as CredentialsType } from './index-BwnzoldS.js';
15
15
  import '@oclif/core';
16
16
  import { useMutation } from '@tanstack/react-query';
17
17
  import 'crypto-js';
@@ -24,12 +24,13 @@ import 'string-length';
24
24
  import 'strip-ansi';
25
25
  import 'open';
26
26
  import '@inkjs/ui';
27
+ import './ejs-DirFZbza.js';
27
28
  import 'marked';
28
29
  import 'marked-terminal';
29
30
  import 'qrcode';
30
- import { G as GameContext } from './index-DfUg5j06.js';
31
- import { c as cacheKeys } from './useAndroidServiceAccountTestResult-D4e5AKAZ.js';
32
- import { i as importCredential } from './import-BoY5e0uJ.js';
31
+ import { G as GameContext } from './index-hoHfGrjg.js';
32
+ import { c as cacheKeys } from './useAndroidServiceAccountTestResult-CwKeW0ED.js';
33
+ import { i as importCredential } from './import-BpGyif-m.js';
33
34
 
34
35
  async function importKeystore({ log = () => {
35
36
  }, ...opt }) {
@@ -7,13 +7,13 @@ import { useState, useRef, useEffect } from 'react';
7
7
  import 'node:fs';
8
8
  import 'crypto-js';
9
9
  import 'uuid';
10
- import { p as getAuthedHeaders, o as API_URL, I as castArrayObjectDates, J as JobStatus, a4 as castJobDates, a1 as castObjectDates, a5 as getShortTime } from './index-pj8JVg5X.js';
11
- import { d as getStageColor, j as getMessageColor } from './index-B27WJDxn.js';
10
+ import { p as getAuthedHeaders, o as API_URL, I as castArrayObjectDates, J as JobStatus, a9 as castJobDates, a7 as castObjectDates, aa as getShortTime } from './index-BwnzoldS.js';
11
+ import { d as getStageColor, j as getMessageColor } from './index-CJWMt1s-.js';
12
12
  import 'luxon';
13
13
  import 'fast-glob';
14
14
  import 'yazl';
15
15
  import 'socket.io-client';
16
- import { c as cacheKeys } from './useAndroidServiceAccountTestResult-D4e5AKAZ.js';
16
+ import { c as cacheKeys } from './useAndroidServiceAccountTestResult-CwKeW0ED.js';
17
17
  import 'node:crypto';
18
18
  import 'node:path';
19
19
  import 'node:readline';
@@ -22,8 +22,8 @@ import 'readline-sync';
22
22
  import 'isomorphic-git';
23
23
  import '@oclif/core';
24
24
  import 'fullscreen-ink';
25
- import { f as useJob } from './index-DfUg5j06.js';
26
- import { u as useWebSocket } from './useWebSocket-CRV7V69Q.js';
25
+ import { f as useJob } from './index-hoHfGrjg.js';
26
+ import { u as useWebSocket } from './useWebSocket-cM5yOcDv.js';
27
27
  import { T as Title } from './Title-BCQtayg6.js';
28
28
  import stringLength from 'string-length';
29
29
  import stripAnsi from 'strip-ansi';
@@ -4,9 +4,9 @@ import axios from 'axios';
4
4
  import fg from 'fast-glob';
5
5
  import { v4 } from 'uuid';
6
6
  import { ZipFile } from 'yazl';
7
- import { K as queryClient, v as DEFAULT_SHIPPED_FILES_GLOBS, w as DEFAULT_IGNORED_FILES_GLOBS, $ as getNewUploadTicket, a0 as startJobsFromUpload } from './index-pj8JVg5X.js';
8
- import { c as cacheKeys } from './useAndroidServiceAccountTestResult-D4e5AKAZ.js';
9
- import { f as getFileHash, h as getPlatformName } from './index-B27WJDxn.js';
7
+ import { K as queryClient, v as DEFAULT_SHIPPED_FILES_GLOBS, w as DEFAULT_IGNORED_FILES_GLOBS, a4 as getNewUploadTicket, a5 as startJobsFromUpload } from './index-BwnzoldS.js';
8
+ import { c as cacheKeys } from './useAndroidServiceAccountTestResult-CwKeW0ED.js';
9
+ import { f as getFileHash, h as getPlatformName } from './index-CJWMt1s-.js';
10
10
  import { g as getCWDGitInfo } from './git-BpsfNFZ_.js';
11
11
  import { jsx, Fragment } from 'react/jsx-runtime';
12
12
  import 'ink';
@@ -15,18 +15,19 @@ import 'react';
15
15
  import 'crypto-js';
16
16
  import 'luxon';
17
17
  import 'socket.io-client';
18
- import { u as useJobWatching } from './JobLogTail-BYcJgPcL.js';
18
+ import { u as useJobWatching } from './JobLogTail-D35FO5v-.js';
19
19
  import 'fullscreen-ink';
20
20
  import 'string-length';
21
21
  import 'strip-ansi';
22
22
  import 'open';
23
23
  import '@inkjs/ui';
24
24
  import 'node:path';
25
+ import './ejs-DirFZbza.js';
25
26
  import 'marked';
26
27
  import 'marked-terminal';
27
28
  import { P as ProgressSpinner } from './ProgressSpinner-Um6ARKlk.js';
28
29
  import 'qrcode';
29
- import './index-DfUg5j06.js';
30
+ import './index-hoHfGrjg.js';
30
31
 
31
32
  async function ship({ command, log = () => {
32
33
  }, shipFlags }) {
@@ -3,18 +3,18 @@ import { Box, Text } from 'ink';
3
3
  import Spinner from 'ink-spinner';
4
4
  import { DateTime } from 'luxon';
5
5
  import { useState, useEffect } from 'react';
6
- import { J as JobStatus } from './index-pj8JVg5X.js';
6
+ import { J as JobStatus } from './index-BwnzoldS.js';
7
7
  import '@tanstack/react-query';
8
8
  import 'axios';
9
9
  import 'node:fs';
10
10
  import 'crypto-js';
11
11
  import 'uuid';
12
- import { d as getStageColor, c as getJobStatusColor } from './index-B27WJDxn.js';
13
- import { a as getJobSummary } from './index-DfUg5j06.js';
12
+ import { d as getStageColor, c as getJobStatusColor } from './index-CJWMt1s-.js';
13
+ import { a as getJobSummary } from './index-hoHfGrjg.js';
14
14
  import 'fast-glob';
15
15
  import 'yazl';
16
16
  import 'socket.io-client';
17
- import { u as useJobWatching } from './JobLogTail-BYcJgPcL.js';
17
+ import { u as useJobWatching } from './JobLogTail-D35FO5v-.js';
18
18
  import 'fullscreen-ink';
19
19
  import { a as StatusRow, b as StatusRowLabel } from './StatusTable-DzRWcMr4.js';
20
20
  import { T as Title } from './Title-BCQtayg6.js';
@@ -10,13 +10,13 @@ import 'readline-sync';
10
10
  import 'luxon';
11
11
  import 'axios';
12
12
  import 'isomorphic-git';
13
- import './index-pj8JVg5X.js';
13
+ import './index-BwnzoldS.js';
14
14
  import '@oclif/core';
15
15
  import '@tanstack/react-query';
16
16
  import 'react';
17
17
  import 'crypto-js';
18
18
  import 'uuid';
19
- import { u as useProjectCredentials, g as getProjectCredentialSummary } from './useProjectCredentials-BjvdJdQg.js';
19
+ import { u as useProjectCredentials, g as getProjectCredentialSummary } from './useProjectCredentials-DxdwJCfU.js';
20
20
  import 'fast-glob';
21
21
  import 'yazl';
22
22
  import 'socket.io-client';
@@ -1,4 +1,4 @@
1
- import { jsxs, jsx } from 'react/jsx-runtime';
1
+ import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
2
2
  import { Box, Text } from 'ink';
3
3
  import Spinner from 'ink-spinner';
4
4
  import React from 'react';
@@ -18,6 +18,7 @@ const RunWithSpinner = ({
18
18
  return onComplete();
19
19
  });
20
20
  }, []);
21
+ if (!isInProgress && !msgComplete) return /* @__PURE__ */ jsx(Fragment, {});
21
22
  return /* @__PURE__ */ jsxs(Box, { children: [
22
23
  /* @__PURE__ */ jsx(Text, { children: isInProgress ? msgInProgress : msgComplete }),
23
24
  isInProgress && /* @__PURE__ */ jsx(Spinner, { type: spinnerType })
@@ -10,7 +10,7 @@ import 'readline-sync';
10
10
  import 'luxon';
11
11
  import axios from 'axios';
12
12
  import 'isomorphic-git';
13
- import { b as getShortDate, p as getAuthedHeaders, o as API_URL, I as castArrayObjectDates } from './index-pj8JVg5X.js';
13
+ import { b as getShortDate, p as getAuthedHeaders, o as API_URL, I as castArrayObjectDates } from './index-BwnzoldS.js';
14
14
  import '@oclif/core';
15
15
  import { useQuery } from '@tanstack/react-query';
16
16
  import 'react';
@@ -18,8 +18,8 @@ import 'crypto-js';
18
18
  import 'uuid';
19
19
  import 'fast-glob';
20
20
  import 'yazl';
21
- import { c as cacheKeys } from './useAndroidServiceAccountTestResult-D4e5AKAZ.js';
22
- import { g as getShortUUID } from './index-B27WJDxn.js';
21
+ import { c as cacheKeys } from './useAndroidServiceAccountTestResult-CwKeW0ED.js';
22
+ import { g as getShortUUID } from './index-CJWMt1s-.js';
23
23
  import 'socket.io-client';
24
24
  import 'fullscreen-ink';
25
25
  import { T as Table } from './Table-FaNgpyeq.js';
@@ -40,13 +40,13 @@ async function queryUserCredentials(params) {
40
40
  }
41
41
  }
42
42
  function getUserCredentialSummary(credential) {
43
- return {
44
- createdAt: getShortDate(credential.createdAt),
45
- id: getShortUUID(credential.id),
46
- isActive: credential.isActive,
47
- serial: credential.serialNumber,
48
- type: credential.type
49
- };
43
+ const summary = {};
44
+ summary.id = getShortUUID(credential.id);
45
+ summary.type = credential.type;
46
+ summary.serial = credential.serialNumber;
47
+ summary.isActive = credential.isActive;
48
+ summary.createdAt = getShortDate(credential.createdAt);
49
+ return summary;
50
50
  }
51
51
  const useUserCredentials = ({
52
52
  platform,
@@ -1,4 +1,4 @@
1
- import { B as BaseAuthenticatedCommand } from './index-pj8JVg5X.js';
1
+ import { B as BaseAuthenticatedCommand } from './index-BwnzoldS.js';
2
2
 
3
3
  class BaseAppleCommand extends BaseAuthenticatedCommand {
4
4
  async init() {
@@ -1,5 +1,5 @@
1
- import { c as BaseGameCommand, Q as getGoogleStatus, R as getGodotAndroidPackageName } from './index-pj8JVg5X.js';
2
- import { b as generatePackageName, a as getInput } from './index-B27WJDxn.js';
1
+ import { c as BaseGameCommand, Q as getGoogleStatus, R as getGodotAndroidPackageName } from './index-BwnzoldS.js';
2
+ import { b as generatePackageName, a as getInput } from './index-CJWMt1s-.js';
3
3
 
4
4
  class BaseGameAndroidCommand extends BaseGameCommand {
5
5
  async checkGoogleAuth(waitForAuth = false) {
@@ -0,0 +1,100 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { Flags } from '@oclif/core';
3
+ import { render } from 'ink';
4
+ import { v4 } from 'uuid';
5
+ import { B as BaseAuthenticatedCommand, _ as createAPIKey, b as getShortDate } from '../../index-BwnzoldS.js';
6
+ import 'ink-spinner';
7
+ import { g as getShortUUID } from '../../index-CJWMt1s-.js';
8
+ import 'react';
9
+ import '@tanstack/react-query';
10
+ import 'axios';
11
+ import 'luxon';
12
+ import 'node:fs';
13
+ import 'fast-glob';
14
+ import 'yazl';
15
+ import 'socket.io-client';
16
+ import 'fullscreen-ink';
17
+ import 'string-length';
18
+ import 'strip-ansi';
19
+ import 'open';
20
+ import '@inkjs/ui';
21
+ import { g as getRenderedMarkdown } from '../../index-hoHfGrjg.js';
22
+ import 'qrcode';
23
+ import { R as RunWithSpinner } from '../../RunWithSpinner-DucRnFp6.js';
24
+ import { C as Command } from '../../Command-DN1j3tjt.js';
25
+ import 'crypto-js';
26
+ import 'node:path';
27
+ import '@expo/apple-utils/build/index.js';
28
+ import 'node:crypto';
29
+ import 'node:readline';
30
+ import 'node:url';
31
+ import 'readline-sync';
32
+ import 'isomorphic-git';
33
+ import 'deepmerge';
34
+ import 'ini';
35
+ import '../../useAndroidServiceAccountTestResult-CwKeW0ED.js';
36
+ import '../../ejs-DirFZbza.js';
37
+ import 'fs';
38
+ import 'path';
39
+ import 'marked';
40
+ import 'marked-terminal';
41
+
42
+ class ApiKeyCreate extends BaseAuthenticatedCommand {
43
+ static args = {};
44
+ static description = "Create a new API key for your ShipThis account.";
45
+ static examples = [
46
+ "<%= config.bin %> <%= command.id %> --durationDays 30",
47
+ "<%= config.bin %> <%= command.id %> --name ci-key --durationDays 90",
48
+ "<%= config.bin %> <%= command.id %> --name ci-key-headless --durationDays 365 --quiet"
49
+ ];
50
+ static flags = {
51
+ durationDays: Flags.integer({
52
+ char: "d",
53
+ default: 365,
54
+ description: "duration of the API key in days"
55
+ }),
56
+ name: Flags.string({
57
+ char: "n",
58
+ description: "name to apply to the API key (if not provided, a random name will be generated)"
59
+ }),
60
+ quiet: Flags.boolean({
61
+ char: "q",
62
+ default: false,
63
+ description: "Outputs just the secret value"
64
+ })
65
+ };
66
+ async run() {
67
+ const { durationDays, name } = this.flags;
68
+ const createKey = async () => {
69
+ const apiKeyName = name ? name : `api-key-${getShortUUID(v4())}`;
70
+ const apiKeyWithSecret = await createAPIKey({ durationDays, name: apiKeyName });
71
+ const successMessage = getRenderedMarkdown({
72
+ filename: "apikey-create.md.ejs",
73
+ templateVars: {
74
+ keyExpiry: getShortDate(apiKeyWithSecret.expiresAt),
75
+ keyId: getShortUUID(apiKeyWithSecret.id),
76
+ keyName: apiKeyWithSecret.name,
77
+ keySecret: apiKeyWithSecret.secret
78
+ }
79
+ });
80
+ if (this.flags.quiet) {
81
+ this.log(apiKeyWithSecret.secret);
82
+ return;
83
+ }
84
+ this.log(successMessage);
85
+ };
86
+ if (this.flags.quiet) return await createKey();
87
+ render(
88
+ /* @__PURE__ */ jsx(Command, { command: this, children: /* @__PURE__ */ jsx(
89
+ RunWithSpinner,
90
+ {
91
+ executeMethod: createKey,
92
+ msgInProgress: "Creating ShipThis API key...",
93
+ onComplete: () => process.exit(0)
94
+ }
95
+ ) })
96
+ );
97
+ }
98
+ }
99
+
100
+ export { ApiKeyCreate as default };