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.
- package/README.md +122 -41
- package/assets/markdown/create-google-play-game.md +2 -4
- package/assets/markdown/ship-success.md +1 -1
- package/dist/{AppleBundleIdDetails-Fp5COwTa.js → AppleBundleIdDetails-6H3cNWxw.js} +17 -19
- package/dist/{Command-1p5alCz3.js → Command-WPpmLPkL.js} +13 -12
- package/dist/CommandGame-cxzWG4nT.js +7 -0
- package/dist/{Create-1xAdntNl.js → Create-3Ob8sjik.js} +20 -20
- package/dist/GameStatus-BQEtVKvv.js +137 -0
- package/dist/{Import-CzC-M4ln.js → Import-CFuPDI0K.js} +33 -35
- package/dist/{JobLogTail-CZxoMSd5.js → JobLogTail-0CBLoG8N.js} +53 -52
- package/dist/{JobProgress-BjNgtIjm.js → JobProgress-lKqVT88m.js} +46 -37
- package/dist/{JobStatusTable-BB-PWlwj.js → JobStatusTable-C_ZsZJCm.js} +14 -13
- package/dist/{NextSteps-CK9zHOCt.js → NextSteps-DbJHmscQ.js} +1 -3
- package/dist/{ProgressSpinner-6pw1T8Iw.js → ProgressSpinner-DGcakQSK.js} +1 -1
- package/dist/{ProjectCredentialsTable-DyZep993.js → ProjectCredentialsTable-B5pHOnGu.js} +11 -10
- package/dist/{StatusTable-Dm5St4g-.js → StatusTable-DzRWcMr4.js} +7 -9
- package/dist/{Table-CvM6pccN.js → Table-FaNgpyeq.js} +15 -15
- package/dist/{UserCredentialsTable-BraKyDWT.js → UserCredentialsTable-3W3qesh7.js} +18 -19
- package/dist/{baseAppleCommand-BHRIBtTj.js → baseAppleCommand-BGV088--.js} +1 -1
- package/dist/{baseGameAndroidCommand-SrDRbhAG.js → baseGameAndroidCommand-CsemgVjp.js} +23 -23
- package/dist/commands/apple/apiKey/create.js +35 -35
- package/dist/commands/apple/apiKey/export.js +26 -26
- package/dist/commands/apple/apiKey/import.js +27 -27
- package/dist/commands/apple/apiKey/status.js +31 -31
- package/dist/commands/apple/certificate/create.js +39 -39
- package/dist/commands/apple/certificate/export.js +26 -26
- package/dist/commands/apple/certificate/import.js +27 -27
- package/dist/commands/apple/certificate/status.js +31 -31
- package/dist/commands/apple/login.js +15 -15
- package/dist/commands/apple/status.js +28 -28
- package/dist/commands/dashboard.js +10 -10
- package/dist/commands/game/android/apiKey/connect.js +28 -28
- package/dist/commands/game/android/apiKey/create.js +28 -28
- package/dist/commands/game/android/apiKey/export.js +29 -29
- package/dist/commands/game/android/apiKey/import.js +31 -31
- package/dist/commands/game/android/apiKey/invite.js +14 -14
- package/dist/commands/game/android/apiKey/status.js +29 -29
- package/dist/commands/game/android/keyStore/create.js +24 -24
- package/dist/commands/game/android/keyStore/export.js +28 -28
- package/dist/commands/game/android/keyStore/import.js +35 -35
- package/dist/commands/game/android/keyStore/status.js +26 -26
- package/dist/commands/game/android/status.js +14 -58
- package/dist/commands/game/build/download.js +24 -24
- package/dist/commands/game/build/list.js +37 -37
- package/dist/commands/game/create.js +15 -15
- package/dist/commands/game/details.js +35 -36
- package/dist/commands/game/export.js +12 -12
- package/dist/commands/game/ios/app/addTester.js +24 -24
- package/dist/commands/game/ios/app/create.js +24 -24
- package/dist/commands/game/ios/app/status.js +29 -29
- package/dist/commands/game/ios/app/sync.js +31 -31
- package/dist/commands/game/ios/profile/create.js +30 -30
- package/dist/commands/game/ios/profile/export.js +28 -28
- package/dist/commands/game/ios/profile/import.js +32 -32
- package/dist/commands/game/ios/profile/status.js +36 -36
- package/dist/commands/game/ios/status.js +46 -58
- package/dist/commands/game/ios/wizard.js +31 -31
- package/dist/commands/game/job/list.js +34 -34
- package/dist/commands/game/job/status.js +31 -31
- package/dist/commands/game/list.js +45 -41
- package/dist/commands/game/ship.js +73 -70
- package/dist/commands/game/status.js +38 -82
- package/dist/commands/game/wizard.js +271 -307
- package/dist/commands/internal/fastlane.js +15 -17
- package/dist/commands/internal/readme.js +38 -36
- package/dist/commands/login.js +14 -14
- package/dist/commands/status.js +35 -33
- package/dist/{export-BKn02-NH.js → export-CXsVPXA1.js} +5 -5
- package/dist/{git-DREGq-jc.js → git-BpsfNFZ_.js} +8 -8
- package/dist/{import-CRMaNBVF.js → import-DGvG5REx.js} +14 -14
- package/dist/{index-DxzXU9Hd.js → index-BhhiXbey.js} +244 -221
- package/dist/{index-OZi8bvu8.js → index-C03TV1_J.js} +54 -38
- package/dist/{index-BTAL7EB_.js → index-C66Dd8Xc.js} +80 -79
- package/dist/{index-35Eswf6F.js → index-CGBdOm1q.js} +43 -27
- package/dist/{index--EbYyBAZ.js → index-CS9Gwcb0.js} +41 -43
- package/dist/{index-u1aj1OQW.js → index-CtTI85m-.js} +6 -6
- package/dist/{upload-Bw0zrS4M.js → upload-8y5MQEm9.js} +22 -22
- package/dist/{useAndroidServiceAccountTestResult-CJLIEYmA.js → useAndroidServiceAccountTestResult-DZk5SMxI.js} +11 -13
- package/dist/{useAppleApp-cnb8gX0x.js → useAppleApp-DWYGURwU.js} +4 -4
- package/dist/{useAppleBundleId-B0Etav8g.js → useAppleBundleId-PsTJ2g1B.js} +6 -6
- package/dist/{useProjectCredentials-DX3e_PPc.js → useProjectCredentials-BEphqa18.js} +10 -12
- package/dist/{useWebSocket-BOCa8v6o.js → useWebSocket-5PYa2QER.js} +1 -1
- package/dist/utils/help.js +4 -4
- package/package.json +4 -2
- package/dist/CommandGame-Z4eUQBjn.js +0 -9
- 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
|
|
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
|
-
|
|
34
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
- **
|
|
70
|
-
- **
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
71
|
+
#### Set up an Android game
|
|
95
72
|
|
|
96
73
|
```bash
|
|
97
74
|
shipthis game wizard android
|
|
98
75
|
```
|
|
99
76
|
|
|
100
|
-
|
|
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
|
-
-
|
|
115
|
-
-
|
|
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.
|
|
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,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 '
|
|
5
|
-
import '
|
|
6
|
-
import '
|
|
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 '
|
|
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 '
|
|
24
|
-
import '
|
|
25
|
-
import '
|
|
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-
|
|
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
|
|
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 {
|
|
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 '
|
|
7
|
-
import '
|
|
8
|
-
import '
|
|
9
|
-
import '
|
|
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 '
|
|
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 {
|
|
22
|
+
import { b as CommandProvider } from './index-C66Dd8Xc.js';
|
|
22
23
|
|
|
23
24
|
const Command = ({ children, command }) => {
|
|
24
|
-
const width =
|
|
25
|
-
return /* @__PURE__ */ jsx(QueryClientProvider, { client: queryClient, children: /* @__PURE__ */ jsx(CommandProvider, { command, children: /* @__PURE__ */ jsx(Box, {
|
|
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 {
|
|
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 {
|
|
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 '
|
|
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-
|
|
30
|
-
import '
|
|
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({
|
|
44
|
-
} catch (
|
|
45
|
-
onError(
|
|
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 };
|