shipthis 0.1.30 → 0.1.32

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 (86) hide show
  1. package/README.md +122 -41
  2. package/assets/markdown/create-google-play-game.md +2 -4
  3. package/assets/markdown/ship-success.md +1 -1
  4. package/dist/{AppleBundleIdDetails-Fp5COwTa.js → AppleBundleIdDetails-6H3cNWxw.js} +17 -19
  5. package/dist/{Command-1p5alCz3.js → Command-WPpmLPkL.js} +13 -12
  6. package/dist/CommandGame-cxzWG4nT.js +7 -0
  7. package/dist/{Create-1xAdntNl.js → Create-3Ob8sjik.js} +20 -20
  8. package/dist/GameStatus-BQEtVKvv.js +137 -0
  9. package/dist/{Import-CzC-M4ln.js → Import-CFuPDI0K.js} +33 -35
  10. package/dist/{JobLogTail-CZxoMSd5.js → JobLogTail-0CBLoG8N.js} +53 -52
  11. package/dist/{JobProgress-BjNgtIjm.js → JobProgress-lKqVT88m.js} +46 -37
  12. package/dist/{JobStatusTable-BB-PWlwj.js → JobStatusTable-C_ZsZJCm.js} +14 -13
  13. package/dist/{NextSteps-CK9zHOCt.js → NextSteps-DbJHmscQ.js} +1 -3
  14. package/dist/{ProgressSpinner-6pw1T8Iw.js → ProgressSpinner-DGcakQSK.js} +1 -1
  15. package/dist/{ProjectCredentialsTable-DyZep993.js → ProjectCredentialsTable-B5pHOnGu.js} +11 -10
  16. package/dist/{StatusTable-Dm5St4g-.js → StatusTable-DzRWcMr4.js} +7 -9
  17. package/dist/{Table-CvM6pccN.js → Table-FaNgpyeq.js} +15 -15
  18. package/dist/{UserCredentialsTable-BraKyDWT.js → UserCredentialsTable-3W3qesh7.js} +18 -19
  19. package/dist/{baseAppleCommand-BHRIBtTj.js → baseAppleCommand-BGV088--.js} +1 -1
  20. package/dist/{baseGameAndroidCommand-SrDRbhAG.js → baseGameAndroidCommand-CsemgVjp.js} +23 -23
  21. package/dist/commands/apple/apiKey/create.js +35 -35
  22. package/dist/commands/apple/apiKey/export.js +26 -26
  23. package/dist/commands/apple/apiKey/import.js +27 -27
  24. package/dist/commands/apple/apiKey/status.js +31 -31
  25. package/dist/commands/apple/certificate/create.js +39 -39
  26. package/dist/commands/apple/certificate/export.js +26 -26
  27. package/dist/commands/apple/certificate/import.js +27 -27
  28. package/dist/commands/apple/certificate/status.js +31 -31
  29. package/dist/commands/apple/login.js +15 -15
  30. package/dist/commands/apple/status.js +28 -28
  31. package/dist/commands/dashboard.js +10 -10
  32. package/dist/commands/game/android/apiKey/connect.js +28 -28
  33. package/dist/commands/game/android/apiKey/create.js +28 -28
  34. package/dist/commands/game/android/apiKey/export.js +29 -29
  35. package/dist/commands/game/android/apiKey/import.js +31 -31
  36. package/dist/commands/game/android/apiKey/invite.js +14 -14
  37. package/dist/commands/game/android/apiKey/status.js +29 -29
  38. package/dist/commands/game/android/keyStore/create.js +24 -24
  39. package/dist/commands/game/android/keyStore/export.js +28 -28
  40. package/dist/commands/game/android/keyStore/import.js +35 -35
  41. package/dist/commands/game/android/keyStore/status.js +26 -26
  42. package/dist/commands/game/android/status.js +14 -58
  43. package/dist/commands/game/build/download.js +24 -24
  44. package/dist/commands/game/build/list.js +37 -37
  45. package/dist/commands/game/create.js +15 -15
  46. package/dist/commands/game/details.js +35 -36
  47. package/dist/commands/game/export.js +12 -12
  48. package/dist/commands/game/ios/app/addTester.js +24 -24
  49. package/dist/commands/game/ios/app/create.js +24 -24
  50. package/dist/commands/game/ios/app/status.js +29 -29
  51. package/dist/commands/game/ios/app/sync.js +31 -31
  52. package/dist/commands/game/ios/profile/create.js +30 -30
  53. package/dist/commands/game/ios/profile/export.js +28 -28
  54. package/dist/commands/game/ios/profile/import.js +32 -32
  55. package/dist/commands/game/ios/profile/status.js +36 -36
  56. package/dist/commands/game/ios/status.js +46 -58
  57. package/dist/commands/game/ios/wizard.js +31 -31
  58. package/dist/commands/game/job/list.js +34 -34
  59. package/dist/commands/game/job/status.js +31 -31
  60. package/dist/commands/game/list.js +45 -41
  61. package/dist/commands/game/ship.js +73 -70
  62. package/dist/commands/game/status.js +38 -82
  63. package/dist/commands/game/wizard.js +271 -307
  64. package/dist/commands/internal/fastlane.js +15 -17
  65. package/dist/commands/internal/readme.js +38 -36
  66. package/dist/commands/login.js +14 -14
  67. package/dist/commands/status.js +35 -33
  68. package/dist/{export-BKn02-NH.js → export-CXsVPXA1.js} +5 -5
  69. package/dist/{git-DREGq-jc.js → git-BpsfNFZ_.js} +8 -8
  70. package/dist/{import-CRMaNBVF.js → import-DGvG5REx.js} +14 -14
  71. package/dist/{index-DxzXU9Hd.js → index-BhhiXbey.js} +244 -221
  72. package/dist/{index-OZi8bvu8.js → index-C03TV1_J.js} +54 -38
  73. package/dist/{index-BTAL7EB_.js → index-C66Dd8Xc.js} +80 -79
  74. package/dist/{index-35Eswf6F.js → index-CGBdOm1q.js} +43 -27
  75. package/dist/{index--EbYyBAZ.js → index-CS9Gwcb0.js} +41 -43
  76. package/dist/{index-u1aj1OQW.js → index-CtTI85m-.js} +6 -6
  77. package/dist/{upload-Bw0zrS4M.js → upload-8y5MQEm9.js} +22 -22
  78. package/dist/{useAndroidServiceAccountTestResult-CJLIEYmA.js → useAndroidServiceAccountTestResult-DZk5SMxI.js} +11 -13
  79. package/dist/{useAppleApp-cnb8gX0x.js → useAppleApp-DWYGURwU.js} +4 -4
  80. package/dist/{useAppleBundleId-B0Etav8g.js → useAppleBundleId-PsTJ2g1B.js} +6 -6
  81. package/dist/{useProjectCredentials-DX3e_PPc.js → useProjectCredentials-BEphqa18.js} +10 -12
  82. package/dist/{useWebSocket-BOCa8v6o.js → useWebSocket-5PYa2QER.js} +1 -1
  83. package/dist/utils/help.js +4 -4
  84. package/package.json +4 -2
  85. package/dist/CommandGame-Z4eUQBjn.js +0 -9
  86. package/dist/{RunWithSpinner-BVXNWGD3.js → RunWithSpinner-gMVA07bZ.js} +2 -2
package/README.md CHANGED
@@ -14,7 +14,7 @@
14
14
  <b>ShipThis</b> is a <b>command line tool</b> for building and uploading your <a href="https://godotengine.org/">Godot</a> mobile games to the <b>Apple App Store</b> and <b>Google Play</b>.
15
15
  </p>
16
16
  <p align="center">
17
- ShipThis compiles your game on managed cloud servers no local build tools needed. Use it manually or add it into your CI when you're ready to ship.
17
+ ShipThis compiles your game on managed cloud servers. You do not need Xcode, Android Studio, or SDK installations. You can run it manually or from CI.
18
18
  </p>
19
19
 
20
20
  <p align="center">
@@ -29,45 +29,22 @@
29
29
 
30
30
  ---
31
31
 
32
+ ## Why use ShipThis?
32
33
 
33
- <details>
34
- <summary><strong>Watch: Set up ShipThis for iOS</strong></summary>
34
+ - **Always a free tier** - Enough build minutes for most solo devs
35
+ - **One-command setup** - Use the interactive [`wizard`](https://shipth.is/docs/reference/game/wizard) to configure your game
36
+ - **No additional tools** - No Xcode, Android Studio, or SDK installation required
37
+ - **Simplified provisioning** - We handle iOS certificates, Android keystores, app signing, and API keys
38
+ - **One-command deployment** - Publish to TestFlight or Google Play with a single command
35
39
 
36
- <p align="center">
37
- <a href="https://www.youtube.com/watch?v=ijTUFVk1duw" target="_blank">
38
- <img src="https://img.youtube.com/vi/ijTUFVk1duw/0.jpg" alt="Watch the iOS setup video" width="640" height="480">
39
- </a>
40
- </p>
40
+ ## Quick start
41
41
 
42
- </details>
43
- <details>
44
- <summary><strong>Watch: Set up ShipThis for Android</strong></summary>
45
-
46
- <p align="center">
47
- <picture>
48
- <img height="431" width="672" alt="ShipThis Command - Android Wizard - published game" src="docs/assets/wizard-android-existingx0.5.gif">
49
- </picture>
50
- </p>
51
-
52
- </details>
53
-
54
-
55
- ## ❓ Why use ShipThis?
56
-
57
- - **✅ Always a free tier** – Enough usage for most solo devs.
58
- - **✨ One-command setup** – Our interactive [`wizard`](https://shipth.is/docs/reference/game/wizard) guides you through configuration.
59
- - **⏩ Skip the build tools** – No Xcode, Android Studio, or SDK installation required.
60
- - **🔐 Simplify provisioning** – We handle iOS certificates, Android keystores, app signing, and API keys.
61
- - **🚀 One-command deployment** – Publish to TestFlight or Google Play with a single CLI command.
62
-
63
- ## ⚡️ Quick start
64
-
65
- ### What you'll need
42
+ ### Requirements
66
43
 
67
44
  - A Godot 3.6 or 4.X game
68
45
  - [Node.js](https://nodejs.org/en/download/) version 18.0 or above
69
- - **If you are building an iOS game** an [Apple Developer account](https://developer.apple.com)
70
- - **If you are building an Android game** a [Play Console developer account](https://play.google.com/apps/publish/signup)
46
+ - **To publish an Android game** - a [Play Console developer account](https://play.google.com/apps/publish/signup) (not required for building an APK/AAB)
47
+ - **To build an iOS game** - an [Apple Developer account](https://developer.apple.com)
71
48
 
72
49
  ### 1. Install ShipThis
73
50
 
@@ -81,7 +58,7 @@ npm install -g shipthis
81
58
 
82
59
  Set up an account with ShipThis by logging in for the first time using the [`shipthis login`](https://shipth.is/docs/reference/login) command.
83
60
 
84
- > 🛠 All builds run on managed cloud servers no need to install Xcode or Android Studio locally.
61
+ > 🛠 All builds run on managed cloud servers - no need to install Xcode or Android Studio locally.
85
62
 
86
63
  ```bash
87
64
  shipthis login
@@ -89,20 +66,42 @@ shipthis login
89
66
 
90
67
  ### 3. Set up your game
91
68
 
92
- Next, run the [wizard command](https://shipth.is/docs/reference/game/wizard) to configure your game on ShipThis. The command takes a platform parameter this can be either **android** or **ios**. Run this command from within a Godot game directory (with a **project.godot** file):
69
+ Run the [wizard command](https://shipth.is/docs/reference/game/wizard) to configure your game on ShipThis. The command takes a platform parameter - this can be either **android** or **ios**. Run this command from within a Godot game directory (with a **project.godot** file):
93
70
 
94
- ### Set up an Android game
71
+ #### Set up an Android game
95
72
 
96
73
  ```bash
97
74
  shipthis game wizard android
98
75
  ```
99
76
 
100
- ### Set up an iOS game
77
+ <details>
78
+ <summary><strong>Watch: Set up ShipThis for Android</strong></summary>
79
+
80
+ <p align="center">
81
+ <picture>
82
+ <img height="431" width="672" alt="ShipThis Command - Android Wizard - published game" src="docs/assets/wizard-android-existingx0.5.gif">
83
+ </picture>
84
+ </p>
85
+
86
+ </details>
87
+
88
+ #### Set up an iOS game
101
89
 
102
90
  ```bash
103
91
  shipthis game wizard ios
104
92
  ```
105
93
 
94
+ <details>
95
+ <summary><strong>Watch: Set up ShipThis for iOS</strong></summary>
96
+
97
+ <p align="center">
98
+ <a href="https://www.youtube.com/watch?v=ijTUFVk1duw" target="_blank">
99
+ <img src="https://img.youtube.com/vi/ijTUFVk1duw/0.jpg" alt="Watch the iOS setup video" width="640" height="480">
100
+ </a>
101
+ </p>
102
+
103
+ </details>
104
+
106
105
  ### 4. Ship
107
106
 
108
107
  Now you can publish new versions of your game to TestFlight or Google Play with the [`shipthis game ship`](https://shipth.is/docs/reference/game/ship) command:
@@ -111,8 +110,90 @@ Now you can publish new versions of your game to TestFlight or Google Play with
111
110
  shipthis game ship
112
111
  ```
113
112
 
114
- - 💡 Having issues? Check the [Troubleshooting](https://shipth.is/docs/troubleshooting) or [join our Discord](https://discord.gg/gPjn3S99k4)
115
- - 📚 For detailed documentation, visit [shipth.is/docs](https://shipth.is/docs)
113
+ - Having issues? Check the [Troubleshooting](https://shipth.is/docs/troubleshooting) or [join our Discord](https://discord.gg/gPjn3S99k4)
114
+ - For detailed documentation, visit [shipth.is/docs](https://shipth.is/docs)
115
+
116
+
117
+ ## FAQ
118
+
119
+ <details>
120
+ <summary><strong>Can I build my game as APK without a Google Play account?</strong></summary>
121
+
122
+ ---
123
+
124
+ Yes.
125
+
126
+ Running the wizard command will create a Service Account Key for automatic publishing, you might not need this when initially building your game.
127
+
128
+ You can run the steps below to create a ShipThis account, create the game, create a keystore, and then run the ship command. Later, when you need to setup publishing you can re-run the wizard command.
129
+
130
+
131
+ ```bash
132
+ # Create or login to your shipthis account (OTP based login)
133
+ shipthis login --email me@email.com
134
+
135
+ # Create a ShipThis game - run this in a dir with a project.godot file
136
+ shipthis game create --name "My Game" --androidPackageName "com.my.game"
137
+
138
+ # Create a keystore for signing the APK
139
+ shipthis game android keyStore create
140
+
141
+ # Run the build, skip the publish step, and download as game.apk
142
+ shipthis game ship --follow --platform android --skipPublish --downloadAPK game.apk
143
+ ```
144
+
145
+
146
+ </details>
147
+
148
+
149
+ <details>
150
+ <summary><strong>Do I need a Mac to build for iOS?</strong></summary>
151
+
152
+ ---
153
+
154
+ No, you do not need a Mac, but you will need an Apple Developer Account.
155
+
156
+ ShipThis handles iOS builds on managed macOS cloud servers. The command-line tool communicates with the Apple Developer Portal to configure everything on your behalf.
157
+
158
+ </details>
159
+
160
+ <details>
161
+ <summary><strong>Which versions of Godot are supported?</strong></summary>
162
+
163
+ ---
164
+
165
+ We support **all stable Godot versions since 3.6**, including:
166
+
167
+ | 3.6 | 4.0 | 4.1 | 4.2 | 4.3 | 4.4 |
168
+ |---------|----------|----------|--------|-----|--------|
169
+ | 3.6.1 | 4.0.1 | 4.1.1 | 4.2.1 | | 4.4.1 |
170
+ | | 4.0.2 | 4.1.2 | 4.2.2 | | |
171
+ | | 4.0.3 | 4.1.3 | | | |
172
+ | | 4.0.4 | 4.1.4 | | | |
173
+
174
+ You can read more in our [Godot versioning guide](https://shipth.is/docs/guides/godot-versioning).
175
+
176
+ </details>
177
+
178
+ <details>
179
+ <summary><strong>Do I need to create an export_presets.cfg file?</strong></summary>
180
+
181
+ ---
182
+
183
+ No, the ShipThis build server will generate a valid **export_presets.cfg** for your game.
184
+
185
+ If you provide an **export_presets.cfg** file, the desired preset values will be merged with the generated file.
186
+
187
+ </details>
188
+
189
+ <details>
190
+ <summary><strong>How much does it cost to use ShipThis?</strong></summary>
191
+
192
+ ---
193
+
194
+ ShipThis is currently in open-beta as so it is completely free to use. You can see our planned pricing on the [pricing page](https://shipth.is/pricing).
195
+
196
+ </details>
116
197
 
117
198
  ## 📖 Command Reference
118
199
 
@@ -132,4 +213,4 @@ shipthis game ship
132
213
 
133
214
  - 💬 [Join us on Discord](https://discord.gg/gPjn3S99k4)
134
215
  - 🐛 [Report an issue](https://github.com/shipth-is/cli/issues)
135
- - 📣 Feature ideas? Feedback? We’d love to hear from you – email support@shipth.is
216
+ - 📣 Feature ideas? Feedback? We’d love to hear from you – email support@shipth.is
@@ -1,14 +1,12 @@
1
1
  # Create the game in Google Play
2
2
 
3
- You will need to manually create an "app" in Google Play. This will involve entering the name, agreeing to Google Play's TOS and uploading an initial build (created in the previous step).
4
-
5
- Broadly, the steps are:
3
+ You will need to manually create an "app" in Google Play.
6
4
 
7
5
  1. Log into the **Google Play Console** with your Google account. [https://play.google.com/console](https://play.google.com/console)
8
6
  1. Create a developer account and payments profile if prompted.
9
7
  1. Click **"Create app"** on the Console dashboard.
10
8
  1. Enter the app name, default language, and accept terms.
11
- 1. Go to **"Internal testing"** and create a new release.
9
+ 1. Go to **"Test and release"** > **"Testing"** > **"Internal testing"** and create a new release.
12
10
  1. Upload the initial build **AAB file** of your game from the previous step
13
11
 
14
12
  To download the AAB file from the previous step, please run:
@@ -1,6 +1,6 @@
1
1
  # 🚀 Shipped
2
2
 
3
- **Your game has been successfully built and published.**
3
+ **Your game has been successfully built${if wasPublished} and published${endif}.**
4
4
 
5
5
  ## Next Steps
6
6
 
@@ -1,37 +1,37 @@
1
1
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
2
  import { Box, Text } from 'ink';
3
3
  import Spinner from 'ink-spinner';
4
- import './index-DxzXU9Hd.js';
5
- import 'axios';
6
- import '@tanstack/react-query';
7
- import 'crypto';
8
- import 'fs';
9
- import 'readline-sync';
10
- import 'node:readline';
4
+ import '@inkjs/ui';
5
+ import 'node:crypto';
6
+ import 'node:fs';
11
7
  import 'node:path';
8
+ import 'node:readline';
12
9
  import 'node:url';
10
+ import 'readline-sync';
13
11
  import 'luxon';
12
+ import 'axios';
14
13
  import 'isomorphic-git';
14
+ import './index-BhhiXbey.js';
15
15
  import '@oclif/core';
16
+ import '@tanstack/react-query';
16
17
  import 'react';
17
18
  import 'crypto-js';
18
19
  import 'uuid';
19
- import 'socket.io-client';
20
- import { u as useAppleApp } from './useAppleApp-cnb8gX0x.js';
20
+ import { u as useAppleApp } from './useAppleApp-DWYGURwU.js';
21
21
  import 'fast-glob';
22
22
  import 'yazl';
23
- import '@inkjs/ui';
24
- import './index-BTAL7EB_.js';
25
- import 'open';
26
- import { T as Table } from './Table-CvM6pccN.js';
23
+ import 'socket.io-client';
24
+ import 'fullscreen-ink';
25
+ import { T as Table } from './Table-FaNgpyeq.js';
27
26
  import { T as Title } from './Title-BCQtayg6.js';
28
27
  import 'string-length';
29
28
  import 'strip-ansi';
29
+ import 'open';
30
+ import './index-C66Dd8Xc.js';
30
31
  import 'marked';
31
32
  import 'marked-terminal';
32
- import 'path';
33
33
  import 'qrcode';
34
- import { u as useAppleBundleId } from './useAppleBundleId-B0Etav8g.js';
34
+ import { u as useAppleBundleId } from './useAppleBundleId-PsTJ2g1B.js';
35
35
 
36
36
  const AppleAppDetails = (props) => {
37
37
  const { data, isLoading } = useAppleApp(props);
@@ -44,7 +44,7 @@ const AppleAppDetails = (props) => {
44
44
 
45
45
  const AppleBundleIdDetails = (props) => {
46
46
  const { data, isLoading } = useAppleBundleId(props);
47
- const { bundleIdSummary, capabilitiesTable, shouldSyncCapabilities, capabilities } = data || {};
47
+ const { bundleIdSummary, capabilities, capabilitiesTable, shouldSyncCapabilities } = data || {};
48
48
  return /* @__PURE__ */ jsxs(Fragment, { children: [
49
49
  /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [
50
50
  /* @__PURE__ */ jsx(Title, { children: "BundleId Details (in the Apple Developer Portal)" }),
@@ -56,9 +56,7 @@ const AppleBundleIdDetails = (props) => {
56
56
  /* @__PURE__ */ jsx(
57
57
  Table,
58
58
  {
59
- data: capabilities.map((c) => {
60
- return { capability: `${c}` };
61
- })
59
+ data: capabilities.map((c) => ({ capability: `${c}` }))
62
60
  }
63
61
  )
64
62
  ] }),
@@ -1,28 +1,29 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
- import { Box } from 'ink';
3
2
  import { QueryClientProvider } from '@tanstack/react-query';
4
- import { K as queryClient } from './index-DxzXU9Hd.js';
3
+ import { useScreenSize } from 'fullscreen-ink';
4
+ import { Box } from 'ink';
5
+ import { K as queryClient } from './index-BhhiXbey.js';
5
6
  import 'axios';
6
- import 'crypto';
7
- import 'fs';
8
- import 'readline-sync';
9
- import 'node:readline';
7
+ import 'node:fs';
8
+ import 'crypto-js';
9
+ import 'uuid';
10
+ import 'luxon';
11
+ import 'node:crypto';
10
12
  import 'node:path';
13
+ import 'node:readline';
11
14
  import 'node:url';
12
- import 'luxon';
15
+ import 'readline-sync';
13
16
  import 'isomorphic-git';
14
17
  import '@oclif/core';
15
18
  import 'react';
16
- import 'crypto-js';
17
- import 'uuid';
18
19
  import 'socket.io-client';
19
20
  import 'fast-glob';
20
21
  import 'yazl';
21
- import { C as CommandProvider } from './index-BTAL7EB_.js';
22
+ import { b as CommandProvider } from './index-C66Dd8Xc.js';
22
23
 
23
24
  const Command = ({ children, command }) => {
24
- const width = process.stdout.columns || 80;
25
- return /* @__PURE__ */ jsx(QueryClientProvider, { client: queryClient, children: /* @__PURE__ */ jsx(CommandProvider, { command, children: /* @__PURE__ */ jsx(Box, { width, flexDirection: "column", children }) }) });
25
+ const { width } = useScreenSize();
26
+ return /* @__PURE__ */ jsx(QueryClientProvider, { client: queryClient, children: /* @__PURE__ */ jsx(CommandProvider, { command, children: /* @__PURE__ */ jsx(Box, { flexDirection: "column", width, children }) }) });
26
27
  };
27
28
 
28
29
  export { Command as C };
@@ -0,0 +1,7 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { c as GameProvider } from './index-C66Dd8Xc.js';
3
+ import { C as Command } from './Command-WPpmLPkL.js';
4
+
5
+ const CommandGame = ({ children, command }) => /* @__PURE__ */ jsx(Command, { command, children: /* @__PURE__ */ jsx(GameProvider, { children }) });
6
+
7
+ export { CommandGame as C };
@@ -1,34 +1,34 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
- import { Box } from 'ink';
2
+ import { useQueryClient } from '@tanstack/react-query';
3
3
  import axios from 'axios';
4
+ import { Box } from 'ink';
4
5
  import { useContext } from 'react';
5
- import { useQueryClient } from '@tanstack/react-query';
6
- import { p as getAuthedHeaders, q as API_URL } from './index-DxzXU9Hd.js';
7
- import { c as cacheKeys } from './useAndroidServiceAccountTestResult-CJLIEYmA.js';
8
- import { b as GameContext } from './index-BTAL7EB_.js';
6
+ import { p as getAuthedHeaders, o as API_URL } from './index-BhhiXbey.js';
9
7
  import 'ink-spinner';
10
- import '@inkjs/ui';
11
- import 'fs';
12
- import 'uuid';
13
- import 'yazl';
14
- import 'crypto';
15
- import 'readline-sync';
16
- import 'node:readline';
8
+ import 'node:crypto';
9
+ import 'node:fs';
17
10
  import 'node:path';
11
+ import 'node:readline';
18
12
  import 'node:url';
13
+ import 'readline-sync';
19
14
  import 'luxon';
20
15
  import 'isomorphic-git';
21
16
  import '@oclif/core';
17
+ import { c as cacheKeys } from './useAndroidServiceAccountTestResult-DZk5SMxI.js';
22
18
  import 'fast-glob';
19
+ import 'uuid';
20
+ import 'yazl';
23
21
  import 'socket.io-client';
22
+ import 'fullscreen-ink';
23
+ import 'string-length';
24
+ import 'strip-ansi';
24
25
  import 'open';
26
+ import '@inkjs/ui';
25
27
  import 'marked';
26
28
  import 'marked-terminal';
27
- import 'path';
28
29
  import 'qrcode';
29
- import { R as RunWithSpinner } from './RunWithSpinner-BVXNWGD3.js';
30
- import 'string-length';
31
- import 'strip-ansi';
30
+ import { R as RunWithSpinner } from './RunWithSpinner-gMVA07bZ.js';
31
+ import { G as GameContext } from './index-C66Dd8Xc.js';
32
32
 
33
33
  const CreateKeystore = ({ onComplete, onError, ...boxProps }) => {
34
34
  const { gameId } = useContext(GameContext);
@@ -40,17 +40,17 @@ const CreateKeystore = ({ onComplete, onError, ...boxProps }) => {
40
40
  await axios.post(`${API_URL}/projects/${gameId}/credentials/android/certificate`, null, {
41
41
  headers
42
42
  });
43
- queryClient.invalidateQueries({ queryKey: cacheKeys.projectCredentials({ projectId: gameId, pageNumber: 0 }) });
44
- } catch (err) {
45
- onError(err);
43
+ queryClient.invalidateQueries({ queryKey: cacheKeys.projectCredentials({ pageNumber: 0, projectId: gameId }) });
44
+ } catch (error) {
45
+ onError(error);
46
46
  }
47
47
  };
48
48
  return /* @__PURE__ */ jsx(Box, { flexDirection: "column", gap: 1, ...boxProps, children: gameId && /* @__PURE__ */ jsx(
49
49
  RunWithSpinner,
50
50
  {
51
51
  executeMethod: handleCreate,
52
- msgInProgress: "Creating Keystore...",
53
52
  msgComplete: "Keystore created",
53
+ msgInProgress: "Creating Keystore...",
54
54
  onComplete
55
55
  }
56
56
  ) });
@@ -0,0 +1,137 @@
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
+ import { Text, Box } from 'ink';
3
+ import { useState, useEffect, useContext } from 'react';
4
+ import { b as getShortDate, P as Platform, E as getProject, F as getProjectPlatformProgress } from './index-BhhiXbey.js';
5
+ import 'ink-spinner';
6
+ import { g as getShortUUID, m as makeHumanReadable } from './index-CGBdOm1q.js';
7
+ import '@tanstack/react-query';
8
+ import 'axios';
9
+ import 'luxon';
10
+ import 'node:fs';
11
+ import 'fast-glob';
12
+ import 'uuid';
13
+ import 'yazl';
14
+ import 'socket.io-client';
15
+ import 'fullscreen-ink';
16
+ import 'string-length';
17
+ import 'strip-ansi';
18
+ import { S as StatusTable } from './StatusTable-DzRWcMr4.js';
19
+ import 'open';
20
+ import '@inkjs/ui';
21
+ import 'node:path';
22
+ import 'marked';
23
+ import 'marked-terminal';
24
+ import { N as NextSteps } from './NextSteps-DbJHmscQ.js';
25
+ import 'qrcode';
26
+ import { G as GameContext, C as CommandContext } from './index-C66Dd8Xc.js';
27
+
28
+ function isPlatformConfigured(platform, progress) {
29
+ if (!progress) return false;
30
+ return progress.platform === platform && progress.hasBundleSet && progress.hasCredentialsForPlatform && progress.hasApiKeyForPlatform;
31
+ }
32
+ function getSteps(platform, progress) {
33
+ if (!progress) return ["shipthis game wizard " + platform.toLowerCase()];
34
+ switch (platform) {
35
+ case Platform.ANDROID: {
36
+ return [
37
+ !progress.hasCredentialsForPlatform && "shipthis game android keyStore create",
38
+ !progress.hasApiKeyForPlatform && "shipthis game android apiKey create",
39
+ isPlatformConfigured(platform, progress) && "shipthis game ship"
40
+ ].filter(Boolean);
41
+ }
42
+ case Platform.IOS: {
43
+ return [
44
+ !progress.hasApiKeyForPlatform && "shipthis apple apiKey create",
45
+ !progress.hasCredentialsForPlatform && "shipthis game ios profile create",
46
+ isPlatformConfigured(platform, progress) && "shipthis game ship"
47
+ ].filter(Boolean);
48
+ }
49
+ default: {
50
+ throw new Error("Invalid platform");
51
+ }
52
+ }
53
+ }
54
+ async function fetchGameStatus(gameId, platforms) {
55
+ const game = await getProject(gameId);
56
+ const isEnabled = {};
57
+ const statuses = {};
58
+ for (const platform of platforms) {
59
+ isEnabled[platform] = platform === Platform.IOS ? Boolean(game.details?.iosBundleId) : Boolean(game.details?.androidPackageName);
60
+ if (isEnabled[platform]) {
61
+ statuses[platform] = await getProjectPlatformProgress(game.id, platform);
62
+ }
63
+ }
64
+ let steps = [];
65
+ for (const platform of platforms) {
66
+ steps = steps.concat(getSteps(platform, statuses[platform]));
67
+ }
68
+ let exitCode = 0;
69
+ for (const platform of platforms) {
70
+ const platformStatus = statuses[platform];
71
+ if (!platformStatus) continue;
72
+ const hasConfigError = isEnabled[platform] && !isPlatformConfigured(platform, platformStatus);
73
+ if (hasConfigError) exitCode = exitCode || 1;
74
+ }
75
+ if (platforms.length === 1 && !isEnabled[platforms[0]]) {
76
+ exitCode = exitCode || 1;
77
+ } else if (platforms.length > 1 && !isEnabled[Platform.IOS] && !isEnabled[Platform.ANDROID]) {
78
+ exitCode = exitCode || 1;
79
+ }
80
+ return {
81
+ exitCode,
82
+ game,
83
+ isEnabled,
84
+ statuses,
85
+ steps
86
+ };
87
+ }
88
+ const GameStatusDetails = ({ children, gameId, onComplete, onError, platforms }) => {
89
+ const [state, setState] = useState(null);
90
+ useEffect(() => {
91
+ fetchGameStatus(gameId, platforms).then((res) => {
92
+ setState(res);
93
+ setTimeout(() => onComplete?.(res.exitCode), 0);
94
+ }).catch((error) => onError?.(error));
95
+ }, []);
96
+ if (!state) return /* @__PURE__ */ jsx(Text, {});
97
+ const { game, statuses, steps } = state;
98
+ 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
+ ),
113
+ platforms.map((platform) => {
114
+ const status = statuses[platform];
115
+ const label = platform === Platform.IOS ? "iOS" : "Android";
116
+ const color = platforms.length === 1 ? "red" : "yellow";
117
+ const { platform: _, ...statusValues } = status || {};
118
+ return /* @__PURE__ */ jsx(Box, { marginTop: 1, children: status ? /* @__PURE__ */ jsx(StatusTable, { statuses: makeHumanReadable(statusValues), title: `${label} Status` }) : /* @__PURE__ */ jsxs(Text, { color, children: [
119
+ "The ",
120
+ label,
121
+ " platform is not enabled for this game."
122
+ ] }) }, platform);
123
+ }),
124
+ children,
125
+ /* @__PURE__ */ jsx(NextSteps, { steps })
126
+ ] });
127
+ };
128
+ const GameStatus$1 = ({ children, onComplete }) => {
129
+ const { gameId } = useContext(GameContext);
130
+ const { command } = useContext(CommandContext);
131
+ const flags = command && command.getFlags() || {};
132
+ const platforms = flags.platform ? [flags.platform.toUpperCase()] : [Platform.IOS, Platform.ANDROID];
133
+ if (!gameId) return null;
134
+ return /* @__PURE__ */ jsx(GameStatusDetails, { gameId, onComplete, platforms, children });
135
+ };
136
+
137
+ export { GameStatusDetails as G, GameStatus$1 as a };