shipthis 0.1.42 → 0.1.44

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 (91) hide show
  1. package/README.md +20 -7
  2. package/dist/{AppleBundleIdDetails-jDq3gYbk.js → AppleBundleIdDetails-DSTNVuCE.js} +7 -7
  3. package/dist/{Command-cVo97lkQ.js → Command-CUAYljjP.js} +5 -5
  4. package/dist/{CommandGame-BwudtYCO.js → CommandGame-DpCdhjIa.js} +2 -2
  5. package/dist/{Create-By4NsPEI.js → Create-CrvCt5uP.js} +4 -3
  6. package/dist/{GameStatus-C59zQE1H.js → GameStatus-4GPzUgCD.js} +3 -3
  7. package/dist/{Import-DTcVM-T-.js → Import-BXH6fSxe.js} +6 -6
  8. package/dist/{JobLogTail-BzisGkY8.js → JobLogTail-CNw7TQdK.js} +6 -6
  9. package/dist/{JobProgress-DAnhaTho.js → JobProgress-BbklmvdG.js} +140 -26
  10. package/dist/{JobStatusTable-BYEi8dtD.js → JobStatusTable-L4wAk8Ns.js} +4 -6
  11. package/dist/{ProjectCredentialsTable-NZf3V39z.js → ProjectCredentialsTable-BfMmJ7AU.js} +5 -5
  12. package/dist/{UserCredentialsTable-Dp884nYO.js → UserCredentialsTable-081xdlb9.js} +5 -5
  13. package/dist/{baseAppleCommand-DewNWX3L.js → baseAppleCommand-DDQU5PTs.js} +1 -1
  14. package/dist/{baseCommand-CscxrTMI.js → baseCommand-CdsX3LS8.js} +7 -18
  15. package/dist/{baseGameAndroidCommand-CEcDz5P2.js → baseGameAndroidCommand-CAQVvU3i.js} +2 -2
  16. package/dist/{baseGameCommand-BKvHM3h_.js → baseGameCommand-CCyAhN-V.js} +4 -4
  17. package/dist/commands/apiKey/create.js +5 -5
  18. package/dist/commands/apiKey/list.js +5 -5
  19. package/dist/commands/apiKey/revoke.js +5 -5
  20. package/dist/commands/apple/apiKey/create.js +9 -9
  21. package/dist/commands/apple/apiKey/delete.js +7 -7
  22. package/dist/commands/apple/apiKey/export.js +8 -8
  23. package/dist/commands/apple/apiKey/import.js +8 -8
  24. package/dist/commands/apple/apiKey/status.js +7 -7
  25. package/dist/commands/apple/certificate/create.js +9 -9
  26. package/dist/commands/apple/certificate/delete.js +7 -7
  27. package/dist/commands/apple/certificate/export.js +8 -8
  28. package/dist/commands/apple/certificate/import.js +8 -8
  29. package/dist/commands/apple/certificate/status.js +7 -7
  30. package/dist/commands/apple/login.js +5 -5
  31. package/dist/commands/apple/status.js +6 -6
  32. package/dist/commands/dashboard.js +4 -4
  33. package/dist/commands/game/android/apiKey/connect.js +10 -10
  34. package/dist/commands/game/android/apiKey/create.js +13 -13
  35. package/dist/commands/game/android/apiKey/delete.js +7 -7
  36. package/dist/commands/game/android/apiKey/export.js +9 -9
  37. package/dist/commands/game/android/apiKey/import.js +9 -9
  38. package/dist/commands/game/android/apiKey/invite.js +5 -5
  39. package/dist/commands/game/android/apiKey/policy.js +5 -5
  40. package/dist/commands/game/android/apiKey/status.js +9 -9
  41. package/dist/commands/game/android/keyStore/create.js +10 -10
  42. package/dist/commands/game/android/keyStore/delete.js +7 -7
  43. package/dist/commands/game/android/keyStore/export.js +8 -8
  44. package/dist/commands/game/android/keyStore/import.js +11 -11
  45. package/dist/commands/game/android/keyStore/status.js +8 -8
  46. package/dist/commands/game/android/status.js +5 -5
  47. package/dist/commands/game/build/download.js +5 -5
  48. package/dist/commands/game/build/list.js +7 -7
  49. package/dist/commands/game/create.js +5 -5
  50. package/dist/commands/game/details.js +6 -6
  51. package/dist/commands/game/export.js +4 -4
  52. package/dist/commands/game/ios/app/addTester.js +7 -7
  53. package/dist/commands/game/ios/app/create.js +6 -6
  54. package/dist/commands/game/ios/app/status.js +9 -9
  55. package/dist/commands/game/ios/app/sync.js +7 -7
  56. package/dist/commands/game/ios/profile/create.js +9 -9
  57. package/dist/commands/game/ios/profile/delete.js +7 -7
  58. package/dist/commands/game/ios/profile/export.js +8 -8
  59. package/dist/commands/game/ios/profile/import.js +8 -8
  60. package/dist/commands/game/ios/profile/status.js +9 -9
  61. package/dist/commands/game/ios/status.js +11 -11
  62. package/dist/commands/game/ios/wizard.js +5 -5
  63. package/dist/commands/game/job/list.js +5 -5
  64. package/dist/commands/game/job/status.js +8 -8
  65. package/dist/commands/game/list.js +5 -5
  66. package/dist/commands/game/ship.js +10 -10
  67. package/dist/commands/game/status.js +8 -8
  68. package/dist/commands/game/wizard.js +17 -17
  69. package/dist/commands/internal/fastlane.js +5 -5
  70. package/dist/commands/internal/readme.js +6 -5
  71. package/dist/commands/login.js +4 -4
  72. package/dist/commands/status.js +6 -6
  73. package/dist/commands/util/android-build-method.js +5 -5
  74. package/dist/commands/util/glass.js +4 -4
  75. package/dist/{export-DBQHSKU-.js → export-4rGFZrzT.js} +1 -1
  76. package/dist/{import-Bk4w8kks.js → import-C9i4RAW6.js} +1 -1
  77. package/dist/{index-WrVwh6le.js → index-B-7dXz3a.js} +7 -7
  78. package/dist/{index-zdIBXHs2.js → index-CQKTbsum.js} +7 -7
  79. package/dist/{index-qOGviaGc.js → index-DBy7ImFs.js} +1 -1
  80. package/dist/{upload-CeRPHRCP.js → upload-DWm3upu4.js} +1 -1
  81. package/dist/{useAppleApp-DgZH0CBS.js → useAppleApp-B0I5eZYx.js} +1 -1
  82. package/dist/{useAppleBundleId-CA7Pg4Hi.js → useAppleBundleId-D4Uk-B7k.js} +1 -1
  83. package/dist/{useAppleProfiles-CUBTPbcC.js → useAppleProfiles-YAcyvQa0.js} +4 -4
  84. package/dist/{useGoogleStatus-DpPwKmw_.js → useGoogleStatus-CMZyzdD6.js} +2 -2
  85. package/dist/{useProjectCredentials-rQLm2O1J.js → useProjectCredentials-8rTRb2Y7.js} +2 -2
  86. package/dist/{useWebSocket-PU55rRGt.js → useWebSocket-CFc1M_mq.js} +1 -1
  87. package/docs/README.md +1 -0
  88. package/docs/autocomplete.md +64 -0
  89. package/npm-shrinkwrap.json +279 -375
  90. package/oclif.manifest.json +1 -1
  91. package/package.json +21 -8
package/README.md CHANGED
@@ -49,6 +49,8 @@ The wizard command takes a platform parameter: either **android** or **ios**. Ru
49
49
 
50
50
  #### Set up an Android game
51
51
 
52
+ Read more about [how ShipThis handles Godot Android builds](https://shipth.is/docs/guides/android-build-methods?ref=github_readme) (Gradle vs legacy, APK/AAB output).
53
+
52
54
  ```bash
53
55
  shipthis game wizard android
54
56
  ```
@@ -89,6 +91,7 @@ Now you can publish new versions of your game to TestFlight or Google Play with
89
91
  shipthis game ship
90
92
  ```
91
93
 
94
+ - New to ShipThis? See the full [Quick start guide](https://shipth.is/docs/guides/quick-start?ref=github_readme)
92
95
  - Having issues? Check the [Troubleshooting](https://shipth.is/docs/troubleshooting?ref=github_readme) or [join our Discord](https://discord.gg/gPjn3S99k4)
93
96
  - For detailed documentation, visit [shipth.is/docs](https://shipth.is/docs?ref=github_readme)
94
97
 
@@ -104,13 +107,14 @@ ShipThis handles iOS builds on managed macOS cloud servers. The CLI connects to
104
107
 
105
108
  We support **all stable Godot versions since 3.6**, including:
106
109
 
107
- | [3.6](https://github.com/godotengine/godot/releases/tag/3.6-stable) | [4.0](https://github.com/godotengine/godot/releases/tag/4.0-stable) | [4.1](https://github.com/godotengine/godot/releases/tag/4.1-stable) | [4.2](https://github.com/godotengine/godot/releases/tag/4.2-stable) | [4.3](https://github.com/godotengine/godot/releases/tag/4.3-stable) | [4.4](https://github.com/godotengine/godot/releases/tag/4.4-stable) | [4.5](https://github.com/godotengine/godot/releases/tag/4.5-stable) |
108
- | ----------------------------------------------------------------------- | ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------ | ----------------------------------------------------------------------- |
109
- | [3.6.1](https://github.com/godotengine/godot/releases/tag/3.6.1-stable) | [4.0.1](https://github.com/godotengine/godot/releases/tag/4.0.1-stable) | [4.1.1](https://github.com/godotengine/godot/releases/tag/4.1.1-stable) | [4.2.1](https://github.com/godotengine/godot/releases/tag/4.2.1-stable) | [4.3.1 *](https://github.com/shipth-is/godot-android-sdk-upgrade/releases/tag/4.3.1-28eb575) | [4.4.1](https://github.com/godotengine/godot/releases/tag/4.4.1-stable) | [4.5.1](https://github.com/godotengine/godot/releases/tag/4.5.1-stable) |
110
- | [3.6.2](https://github.com/godotengine/godot/releases/tag/3.6.2-stable) | [4.0.2](https://github.com/godotengine/godot/releases/tag/4.0.2-stable) | [4.1.2](https://github.com/godotengine/godot/releases/tag/4.1.2-stable) | [4.2.2](https://github.com/godotengine/godot/releases/tag/4.2.2-stable) | | [4.4.2 *](https://github.com/shipth-is/godot-android-sdk-upgrade/releases/tag/4.4.2-ca113b3) | |
111
- | | [4.0.3](https://github.com/godotengine/godot/releases/tag/4.0.3-stable) | [4.1.3](https://github.com/godotengine/godot/releases/tag/4.1.3-stable) | [4.2.3 *](https://github.com/shipth-is/godot-android-sdk-upgrade/releases/tag/4.2.3-d33f443) | | | |
112
- | | [4.0.4](https://github.com/godotengine/godot/releases/tag/4.0.4-stable) | [4.1.4](https://github.com/godotengine/godot/releases/tag/4.1.4-stable) | | | | |
113
- | | [4.0.5 *](https://github.com/shipth-is/godot-android-sdk-upgrade/releases/tag/4.0.5-df6989b) | [4.1.5 *](https://github.com/shipth-is/godot-android-sdk-upgrade/releases/tag/4.1.5-b68debd) | | | | |
110
+ | [3.6](https://github.com/godotengine/godot/releases/tag/3.6-stable) | [4.0](https://github.com/godotengine/godot/releases/tag/4.0-stable) | [4.1](https://github.com/godotengine/godot/releases/tag/4.1-stable) | [4.2](https://github.com/godotengine/godot/releases/tag/4.2-stable) | [4.3](https://github.com/godotengine/godot/releases/tag/4.3-stable) | [4.4](https://github.com/godotengine/godot/releases/tag/4.4-stable) | [4.5](https://github.com/godotengine/godot/releases/tag/4.5-stable) | [4.6](https://github.com/godotengine/godot/releases/tag/4.6-stable) |
111
+ | ----------------------------------------------------------------------- | ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------ |
112
+ | [3.6.1](https://github.com/godotengine/godot/releases/tag/3.6.1-stable) | [4.0.1](https://github.com/godotengine/godot/releases/tag/4.0.1-stable) | [4.1.1](https://github.com/godotengine/godot/releases/tag/4.1.1-stable) | [4.2.1](https://github.com/godotengine/godot/releases/tag/4.2.1-stable) | [4.3.1 *](https://github.com/shipth-is/godot-android-sdk-upgrade/releases/tag/4.3.1-28eb575) | [4.4.1](https://github.com/godotengine/godot/releases/tag/4.4.1-stable) | [4.5.1](https://github.com/godotengine/godot/releases/tag/4.5.1-stable) | |
113
+ | [3.6.2](https://github.com/godotengine/godot/releases/tag/3.6.2-stable) | [4.0.2](https://github.com/godotengine/godot/releases/tag/4.0.2-stable) | [4.1.2](https://github.com/godotengine/godot/releases/tag/4.1.2-stable) | [4.2.2](https://github.com/godotengine/godot/releases/tag/4.2.2-stable) | | [4.4.2 *](https://github.com/shipth-is/godot-android-sdk-upgrade/releases/tag/4.4.2-ca113b3) | | |
114
+ | | [4.0.3](https://github.com/godotengine/godot/releases/tag/4.0.3-stable) | [4.1.3](https://github.com/godotengine/godot/releases/tag/4.1.3-stable) | [4.2.3 *](https://github.com/shipth-is/godot-android-sdk-upgrade/releases/tag/4.2.3-d33f443) | | | | |
115
+ | | [4.0.4](https://github.com/godotengine/godot/releases/tag/4.0.4-stable) | [4.1.4](https://github.com/godotengine/godot/releases/tag/4.1.4-stable) | | | | | |
116
+ | | [4.0.5 *](https://github.com/shipth-is/godot-android-sdk-upgrade/releases/tag/4.0.5-df6989b) | [4.1.5 *](https://github.com/shipth-is/godot-android-sdk-upgrade/releases/tag/4.1.5-b68debd) | | | | | |
117
+
114
118
 
115
119
  **\* Custom builds** - [maintained by us](https://github.com/shipth-is/godot-android-sdk-upgrade/) to support **[Android SDK 35](https://support.google.com/googleplay/android-developer/answer/11926878?hl=en)** and **[16 KB Google Play compatibility requirement](https://developer.android.com/guide/practices/page-sizes)**.
116
120
 
@@ -419,11 +423,20 @@ The build machines do not keep user files after a job completes.
419
423
 
420
424
  ### 🔧 Commands
421
425
 
426
+ - [autocomplete](https://shipth.is/docs/reference/autocomplete?ref=github_readme) - Set up shell tab-completion for commands, topics, and flags
422
427
  - [dashboard](https://shipth.is/docs/reference/dashboard?ref=github_readme) - Opens the web browser to your shipth.is dashboard
423
428
  - [login](https://shipth.is/docs/reference/login?ref=github_readme) - Sign in or create a new account
424
429
  - [status](https://shipth.is/docs/reference/status?ref=github_readme) - Display your overall ShipThis account status
425
430
  - [help](https://shipth.is/docs/reference/help?ref=github_readme) - Display help for a specific topic or command
426
431
 
432
+ ### 📚 Guides
433
+
434
+ - [Quick start](https://shipth.is/docs/guides/quick-start?ref=github_readme) - Get your first build running in minutes
435
+ - [Android build methods](https://shipth.is/docs/guides/android-build-methods?ref=github_readme) - Gradle vs legacy builds, APK & AAB output
436
+ - [Godot versioning](https://shipth.is/docs/guides/godot-versioning?ref=github_readme) - Supported Godot versions and custom builds
437
+ - [Liquid Glass icons](https://shipth.is/docs/guides/liquid-glass?ref=github_readme) - Use Liquid Glass icons with your iOS game
438
+ - [Troubleshooting](https://shipth.is/docs/troubleshooting?ref=github_readme) - Common issues and how to fix them
439
+
427
440
  ## 🌍 Community
428
441
 
429
442
  - 💬 [Join us on Discord](https://discord.gg/gPjn3S99k4)
@@ -11,28 +11,28 @@ import 'readline-sync';
11
11
  import 'luxon';
12
12
  import 'axios';
13
13
  import 'isomorphic-git';
14
- import './baseCommand-CscxrTMI.js';
14
+ import './baseCommand-CdsX3LS8.js';
15
15
  import '@oclif/core';
16
16
  import '@tanstack/react-query';
17
17
  import 'react';
18
- import 'crypto-js';
19
- import 'uuid';
20
- import { u as useAppleApp } from './useAppleApp-DgZH0CBS.js';
18
+ import { u as useAppleApp } from './useAppleApp-B0I5eZYx.js';
21
19
  import 'fast-glob';
22
- import 'yazl';
20
+ import 'uuid';
23
21
  import 'socket.io-client';
24
22
  import 'fullscreen-ink';
23
+ import 'stream';
24
+ import 'yazl';
25
25
  import 'string-length';
26
26
  import 'strip-ansi';
27
27
  import { T as Table } from './Table-FaNgpyeq.js';
28
28
  import { T as Title } from './Title-BCQtayg6.js';
29
29
  import 'open';
30
- import './baseGameCommand-BKvHM3h_.js';
30
+ import './baseGameCommand-CCyAhN-V.js';
31
31
  import 'godot-export-presets';
32
32
  import 'marked';
33
33
  import 'marked-terminal';
34
34
  import 'qrcode';
35
- import { u as useAppleBundleId } from './useAppleBundleId-CA7Pg4Hi.js';
35
+ import { u as useAppleBundleId } from './useAppleBundleId-D4Uk-B7k.js';
36
36
 
37
37
  const AppleAppDetails = (props) => {
38
38
  const { data, isLoading } = useAppleApp(props);
@@ -2,11 +2,9 @@ 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 { I as queryClient } from './baseCommand-CscxrTMI.js';
5
+ import { I as queryClient } from './baseCommand-CdsX3LS8.js';
6
6
  import 'axios';
7
7
  import 'node:fs';
8
- import 'crypto-js';
9
- import 'uuid';
10
8
  import 'luxon';
11
9
  import 'node:crypto';
12
10
  import 'node:path';
@@ -17,9 +15,11 @@ import 'isomorphic-git';
17
15
  import '@oclif/core';
18
16
  import 'react';
19
17
  import 'socket.io-client';
20
- import 'fast-glob';
18
+ import 'stream';
21
19
  import 'yazl';
22
- import { C as CommandProvider } from './baseGameCommand-BKvHM3h_.js';
20
+ import 'fast-glob';
21
+ import 'uuid';
22
+ import { C as CommandProvider } from './baseGameCommand-CCyAhN-V.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 { G as GameProvider } from './baseGameCommand-BKvHM3h_.js';
3
- import { C as Command } from './Command-cVo97lkQ.js';
2
+ import { G as GameProvider } from './baseGameCommand-CCyAhN-V.js';
3
+ import { C as Command } from './Command-CUAYljjP.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 { q as getAuthedHeaders, p as API_URL } from './baseCommand-CscxrTMI.js';
6
+ import { q as getAuthedHeaders, p as API_URL } from './baseCommand-CdsX3LS8.js';
7
7
  import 'ink-spinner';
8
8
  import 'node:crypto';
9
9
  import 'node:fs';
@@ -14,12 +14,13 @@ import 'readline-sync';
14
14
  import 'luxon';
15
15
  import 'isomorphic-git';
16
16
  import '@oclif/core';
17
- import { i as GameContext, k as cacheKeys } from './baseGameCommand-BKvHM3h_.js';
17
+ import { i as GameContext, k as cacheKeys } from './baseGameCommand-CCyAhN-V.js';
18
18
  import 'fast-glob';
19
19
  import 'uuid';
20
- import 'yazl';
21
20
  import 'socket.io-client';
22
21
  import 'fullscreen-ink';
22
+ import 'stream';
23
+ import 'yazl';
23
24
  import 'string-length';
24
25
  import 'strip-ansi';
25
26
  import 'open';
@@ -1,16 +1,15 @@
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 { c as getShortDate, P as Platform, l as getProject, M as getProjectPlatformProgress } from './baseCommand-CscxrTMI.js';
4
+ import { c as getShortDate, P as Platform, l as getProject, M as getProjectPlatformProgress } from './baseCommand-CdsX3LS8.js';
5
5
  import 'ink-spinner';
6
- import { g as getShortUUID, m as makeHumanReadable, i as GameContext, j as CommandContext } from './baseGameCommand-BKvHM3h_.js';
6
+ import { g as getShortUUID, m as makeHumanReadable, i as GameContext, j as CommandContext } from './baseGameCommand-CCyAhN-V.js';
7
7
  import '@tanstack/react-query';
8
8
  import 'axios';
9
9
  import 'luxon';
10
10
  import 'node:fs';
11
11
  import 'fast-glob';
12
12
  import 'uuid';
13
- import 'yazl';
14
13
  import 'socket.io-client';
15
14
  import 'fullscreen-ink';
16
15
  import 'string-length';
@@ -24,6 +23,7 @@ import 'marked-terminal';
24
23
  import { N as NextSteps } from './NextSteps-DbJHmscQ.js';
25
24
  import 'qrcode';
26
25
  import 'godot-export-presets';
26
+ import 'yazl';
27
27
 
28
28
  function isPlatformConfigured(platform, progress) {
29
29
  if (!progress) return false;
@@ -11,25 +11,25 @@ import 'readline-sync';
11
11
  import 'luxon';
12
12
  import 'axios';
13
13
  import 'isomorphic-git';
14
- import { I as queryClient, P as Platform, C as CredentialsType } from './baseCommand-CscxrTMI.js';
14
+ import { I as queryClient, P as Platform, C as CredentialsType } from './baseCommand-CdsX3LS8.js';
15
15
  import '@oclif/core';
16
16
  import { useMutation } from '@tanstack/react-query';
17
- import 'crypto-js';
18
- import { v4 } from 'uuid';
19
17
  import 'fast-glob';
20
- import { ZipFile } from 'yazl';
18
+ import { v4 } from 'uuid';
21
19
  import 'socket.io-client';
22
20
  import 'fullscreen-ink';
21
+ import 'stream';
22
+ import { ZipFile } from 'yazl';
23
23
  import 'string-length';
24
24
  import 'strip-ansi';
25
25
  import 'open';
26
26
  import '@inkjs/ui';
27
- import { k as cacheKeys, i as GameContext } from './baseGameCommand-BKvHM3h_.js';
27
+ import { k as cacheKeys, i as GameContext } from './baseGameCommand-CCyAhN-V.js';
28
28
  import 'marked';
29
29
  import 'marked-terminal';
30
30
  import 'qrcode';
31
31
  import 'godot-export-presets';
32
- import { i as importCredential } from './import-Bk4w8kks.js';
32
+ import { i as importCredential } from './import-C9i4RAW6.js';
33
33
 
34
34
  async function importKeystore({ log = () => {
35
35
  }, ...opt }) {
@@ -5,9 +5,7 @@ import { useInfiniteQuery } from '@tanstack/react-query';
5
5
  import axios from 'axios';
6
6
  import { useState, useRef, useEffect } from 'react';
7
7
  import 'node:fs';
8
- import 'crypto-js';
9
- import 'uuid';
10
- import { q as getAuthedHeaders, p as API_URL, H as castArrayObjectDates, J as JobStatus, a8 as castJobDates, a6 as castObjectDates, a9 as getShortTime } from './baseCommand-CscxrTMI.js';
8
+ import { q as getAuthedHeaders, p as API_URL, H as castArrayObjectDates, J as JobStatus, a8 as castJobDates, a6 as castObjectDates, a9 as getShortTime } from './baseCommand-CdsX3LS8.js';
11
9
  import 'luxon';
12
10
  import 'node:crypto';
13
11
  import 'node:path';
@@ -16,12 +14,14 @@ import 'node:url';
16
14
  import 'readline-sync';
17
15
  import 'isomorphic-git';
18
16
  import '@oclif/core';
19
- import 'fast-glob';
17
+ import 'stream';
20
18
  import 'yazl';
19
+ import 'fast-glob';
20
+ import 'uuid';
21
21
  import 'socket.io-client';
22
- import { k as cacheKeys, y as useJob, h as getStageColor, u as getMessageColor } from './baseGameCommand-BKvHM3h_.js';
22
+ import { k as cacheKeys, y as useJob, h as getStageColor, x as getMessageColor } from './baseGameCommand-CCyAhN-V.js';
23
23
  import 'fullscreen-ink';
24
- import { u as useWebSocket } from './useWebSocket-PU55rRGt.js';
24
+ import { u as useWebSocket } from './useWebSocket-CFc1M_mq.js';
25
25
  import { T as Title } from './Title-BCQtayg6.js';
26
26
  import stringLength from 'string-length';
27
27
  import stripAnsi from 'strip-ansi';
@@ -1,20 +1,20 @@
1
1
  import fs__default from 'node:fs';
2
2
  import { useMutation } from '@tanstack/react-query';
3
- import axios from 'axios';
4
3
  import fg from 'fast-glob';
5
4
  import { v4 } from 'uuid';
5
+ import { I as queryClient, l as getProject, x as DEFAULT_SHIPPED_FILES_GLOBS, y as DEFAULT_IGNORED_FILES_GLOBS, a4 as getNewUploadTicket, a5 as startJobsFromUpload, a2 as LogLevel } from './baseCommand-CdsX3LS8.js';
6
+ import { k as cacheKeys, v as getFileHash, w as getPlatformName, x as getMessageColor } from './baseGameCommand-CCyAhN-V.js';
6
7
  import { ZipFile } from 'yazl';
7
- import { I as queryClient, l as getProject, x as DEFAULT_SHIPPED_FILES_GLOBS, y as DEFAULT_IGNORED_FILES_GLOBS, a2 as getNewUploadTicket, a3 as startJobsFromUpload, a4 as LogLevel } from './baseCommand-CscxrTMI.js';
8
- import { k as cacheKeys, s as getFileHash, t as getPlatformName, u as getMessageColor } from './baseGameCommand-BKvHM3h_.js';
9
8
  import { g as getCWDGitInfo } from './git-BpsfNFZ_.js';
9
+ import { Readable, Transform } from 'stream';
10
10
  import { jsxs, jsx } from 'react/jsx-runtime';
11
11
  import { Box, Text } from 'ink';
12
12
  import 'ink-spinner';
13
13
  import { useState } from 'react';
14
- import 'crypto-js';
14
+ import 'axios';
15
15
  import 'luxon';
16
16
  import 'socket.io-client';
17
- import { u as useJobWatching, a as JobLogLine } from './JobLogTail-BzisGkY8.js';
17
+ import { u as useJobWatching, a as JobLogLine } from './JobLogTail-CNw7TQdK.js';
18
18
  import 'fullscreen-ink';
19
19
  import 'open';
20
20
  import '@inkjs/ui';
@@ -27,6 +27,15 @@ import 'string-length';
27
27
  import 'strip-ansi';
28
28
  import 'godot-export-presets';
29
29
 
30
+ function formatProgressLog(label, data, bytesKey, totalKey, isEstimated = false) {
31
+ const elapsed = data.elapsedSeconds.toFixed(1);
32
+ const transferredMB = (data[bytesKey] / 1024 / 1024).toFixed(2);
33
+ const totalMB = (data[totalKey] / 1024 / 1024).toFixed(2);
34
+ const progressPercent = Math.round(data.progress * 100);
35
+ const speed = data.speedMBps.toFixed(2);
36
+ const totalPrefix = isEstimated ? "~" : "";
37
+ return `${label}: ${progressPercent}% (${transferredMB}MB / ${totalPrefix}${totalMB}MB) - ${elapsed}s - ${speed}MB/s`;
38
+ }
30
39
  async function ship({ command, log = () => {
31
40
  }, shipFlags }) {
32
41
  const commandFlags = command.getFlags();
@@ -51,34 +60,39 @@ async function ship({ command, log = () => {
51
60
  verbose && log("Finding files to include in zip...");
52
61
  const files = await fg(shippedFilesGlobs, { dot: true, ignore: ignoredFilesGlobs });
53
62
  verbose && log(`Found ${files.length} files, adding to zip...`);
54
- const zipFile = new ZipFile();
55
- for (const file of files) {
56
- zipFile.addFile(file, file);
57
- }
58
- const outputZipToFile = (zip, fileName) => new Promise((resolve) => {
59
- const outputStream = fs__default.createWriteStream(fileName);
60
- zip.outputStream.pipe(outputStream).on("close", () => resolve());
61
- zip.end();
63
+ const tmpZipFileName = `shipthis-${v4()}.zip`;
64
+ const tmpZipFile = `${process.cwd()}/${tmpZipFileName}`;
65
+ log(`Creating zip file: ${tmpZipFileName}`);
66
+ await createZip({
67
+ files,
68
+ outputPath: tmpZipFile,
69
+ onProgress: (data) => {
70
+ log(formatProgressLog("Zipping", data, "writtenBytes", "estimatedTotalBytes", true));
71
+ }
62
72
  });
63
- const tmpZipFile = `${process.cwd()}/shipthis-${v4()}.zip`;
64
- log(`Creating zip file: ${tmpZipFile}`);
65
- await outputZipToFile(zipFile, tmpZipFile);
66
- verbose && log("Reading zip file buffer...");
67
- const zipBuffer = fs__default.readFileSync(tmpZipFile);
68
73
  const { size } = fs__default.statSync(tmpZipFile);
69
74
  verbose && log("Requesting upload ticket...");
70
75
  const uploadTicket = await getNewUploadTicket(projectConfig.project.id);
71
76
  log("Uploading zip file...");
72
- await axios.put(uploadTicket.url, zipBuffer, {
73
- headers: {
74
- "Content-Type": "application/zip",
75
- "Content-length": size
77
+ const zipStream = fs__default.createReadStream(tmpZipFile);
78
+ const response = await uploadZip({
79
+ url: uploadTicket.url,
80
+ zipStream,
81
+ zipSize: size,
82
+ onProgress: (data) => {
83
+ log(formatProgressLog("Uploading", data, "loadedBytes", "totalBytes", false));
76
84
  }
77
85
  });
86
+ verbose && log("Computing zip file hash...");
87
+ const zipFileMd5 = await getFileHash(tmpZipFile);
88
+ verbose && log("Cleaning up temporary zip file...");
89
+ fs__default.unlinkSync(tmpZipFile);
90
+ if (!response.ok) {
91
+ throw new Error(`Upload failed: ${response.status} ${response.statusText}`);
92
+ }
93
+ log(`Upload complete`);
78
94
  verbose && log("Fetching Git info...");
79
95
  const gitInfo = await getCWDGitInfo();
80
- verbose && log("Computing file hash...");
81
- const zipFileMd5 = await getFileHash(tmpZipFile);
82
96
  const uploadDetails = {
83
97
  ...gitInfo,
84
98
  zipFileMd5
@@ -93,8 +107,6 @@ async function ship({ command, log = () => {
93
107
  gameEngineVersion: finalFlags.gameEngineVersion
94
108
  };
95
109
  const jobs = await startJobsFromUpload(uploadTicket.id, startJobsOptions);
96
- verbose && log("Cleaning up temporary zip file...");
97
- fs__default.unlinkSync(tmpZipFile);
98
110
  verbose && log("Job submission complete.");
99
111
  if (jobs.length === 0) {
100
112
  throw new Error("No jobs were created. Please check your game configuration and try again.");
@@ -113,6 +125,108 @@ const useShip = () => useMutation({
113
125
  }
114
126
  });
115
127
 
128
+ const ON_PROGRESS_THROTTLE_MS = 2e3;
129
+ function createProgressStream(totalSize, onProgress, throttleMs) {
130
+ let sent = 0;
131
+ let lastCallTime = 0;
132
+ return new Transform({
133
+ transform(chunk, encoding, callback) {
134
+ sent += chunk.length;
135
+ const now = Date.now();
136
+ if (now - lastCallTime >= throttleMs) {
137
+ onProgress(sent, totalSize);
138
+ lastCallTime = now;
139
+ }
140
+ callback(null, chunk);
141
+ }
142
+ });
143
+ }
144
+ function uploadZip({ url, zipStream, zipSize, onProgress }) {
145
+ const startTime = Date.now();
146
+ const progressStream = createProgressStream(zipSize, (sent, total) => {
147
+ const elapsedSeconds = (Date.now() - startTime) / 1e3;
148
+ const speedMBps = elapsedSeconds < 1e-3 ? 0 : sent / elapsedSeconds / 1024 / 1024;
149
+ onProgress({
150
+ progress: total ? sent / total : 0,
151
+ loadedBytes: sent,
152
+ totalBytes: total,
153
+ speedMBps,
154
+ elapsedSeconds
155
+ });
156
+ }, ON_PROGRESS_THROTTLE_MS);
157
+ const streamWithProgress = zipStream.pipe(progressStream);
158
+ const webStream = Readable.toWeb(streamWithProgress);
159
+ const response = fetch(url, {
160
+ method: "PUT",
161
+ headers: {
162
+ "Content-Type": "application/zip",
163
+ "Content-Length": zipSize.toString()
164
+ },
165
+ body: webStream,
166
+ duplex: "half"
167
+ });
168
+ return response;
169
+ }
170
+
171
+ const COMPRESSION_RATIO = 0.65;
172
+ async function createZip({ files, outputPath, onProgress }) {
173
+ const startTime = Date.now();
174
+ const statPromises = files.map(async (file) => {
175
+ try {
176
+ return await fs__default.promises.stat(file);
177
+ } catch {
178
+ return null;
179
+ }
180
+ });
181
+ const statsResults = await Promise.all(statPromises);
182
+ let totalSourceSize = 0;
183
+ for (const stats of statsResults) {
184
+ if (stats) {
185
+ totalSourceSize += stats.size;
186
+ }
187
+ }
188
+ const estimatedZipSize = Math.max(Math.round(totalSourceSize * COMPRESSION_RATIO), 1);
189
+ const zipFile = new ZipFile();
190
+ for (const file of files) {
191
+ zipFile.addFile(file, file);
192
+ }
193
+ return new Promise((resolve, reject) => {
194
+ let settled = false;
195
+ const handleError = (error) => {
196
+ if (settled) return;
197
+ settled = true;
198
+ zipFile.outputStream.destroy();
199
+ progressStream.destroy();
200
+ outputStream.destroy();
201
+ reject(error);
202
+ };
203
+ const handleSuccess = () => {
204
+ if (settled) return;
205
+ settled = true;
206
+ resolve();
207
+ };
208
+ const outputStream = fs__default.createWriteStream(outputPath);
209
+ const progressStream = createProgressStream(estimatedZipSize, (written, total) => {
210
+ const elapsedSeconds = (Date.now() - startTime) / 1e3;
211
+ const speedMBps = elapsedSeconds < 1e-3 ? 0 : written / elapsedSeconds / 1024 / 1024;
212
+ onProgress({
213
+ progress: total ? Math.min(1, written / total) : 0,
214
+ writtenBytes: written,
215
+ estimatedTotalBytes: total,
216
+ sourceTotalBytes: totalSourceSize,
217
+ elapsedSeconds,
218
+ speedMBps
219
+ });
220
+ }, ON_PROGRESS_THROTTLE_MS);
221
+ zipFile.outputStream.on("error", handleError);
222
+ progressStream.on("error", handleError);
223
+ outputStream.on("error", handleError);
224
+ outputStream.on("close", handleSuccess);
225
+ zipFile.outputStream.pipe(progressStream).pipe(outputStream);
226
+ zipFile.end();
227
+ });
228
+ }
229
+
116
230
  const JobProgress = (props) => {
117
231
  const [lastWarningLog, setLastWarningLog] = useState(null);
118
232
  const { progress } = useJobWatching({
@@ -3,17 +3,15 @@ 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 './baseCommand-CscxrTMI.js';
6
+ import { J as JobStatus } from './baseCommand-CdsX3LS8.js';
7
7
  import '@tanstack/react-query';
8
8
  import 'axios';
9
9
  import 'node:fs';
10
- import 'crypto-js';
11
- import 'uuid';
12
- import { e as getJobSummary, h as getStageColor, f as getJobStatusColor } from './baseGameCommand-BKvHM3h_.js';
10
+ import { e as getJobSummary, h as getStageColor, f as getJobStatusColor } from './baseGameCommand-CCyAhN-V.js';
13
11
  import 'fast-glob';
14
- import 'yazl';
12
+ import 'uuid';
15
13
  import 'socket.io-client';
16
- import { u as useJobWatching } from './JobLogTail-BzisGkY8.js';
14
+ import { u as useJobWatching } from './JobLogTail-CNw7TQdK.js';
17
15
  import 'fullscreen-ink';
18
16
  import { a as StatusRow, b as StatusRowLabel } from './StatusTable-DzRWcMr4.js';
19
17
  import { T as Title } from './Title-BCQtayg6.js';
@@ -10,17 +10,17 @@ import 'readline-sync';
10
10
  import 'luxon';
11
11
  import 'axios';
12
12
  import 'isomorphic-git';
13
- import './baseCommand-CscxrTMI.js';
13
+ import './baseCommand-CdsX3LS8.js';
14
14
  import '@oclif/core';
15
15
  import '@tanstack/react-query';
16
16
  import 'react';
17
- import 'crypto-js';
18
- import 'uuid';
19
- import { u as useProjectCredentials, g as getProjectCredentialSummary } from './useProjectCredentials-rQLm2O1J.js';
17
+ import { u as useProjectCredentials, g as getProjectCredentialSummary } from './useProjectCredentials-8rTRb2Y7.js';
20
18
  import 'fast-glob';
21
- import 'yazl';
19
+ import 'uuid';
22
20
  import 'socket.io-client';
23
21
  import 'fullscreen-ink';
22
+ import 'stream';
23
+ import 'yazl';
24
24
  import { T as Table } from './Table-FaNgpyeq.js';
25
25
  import { T as Title } from './Title-BCQtayg6.js';
26
26
 
@@ -10,17 +10,17 @@ import 'readline-sync';
10
10
  import 'luxon';
11
11
  import axios from 'axios';
12
12
  import 'isomorphic-git';
13
- import { c as getShortDate, q as getAuthedHeaders, p as API_URL, H as castArrayObjectDates } from './baseCommand-CscxrTMI.js';
13
+ import { c as getShortDate, q as getAuthedHeaders, p as API_URL, H as castArrayObjectDates } from './baseCommand-CdsX3LS8.js';
14
14
  import '@oclif/core';
15
15
  import { useQuery } from '@tanstack/react-query';
16
16
  import 'react';
17
- import 'crypto-js';
18
- import 'uuid';
19
17
  import 'fast-glob';
20
- import 'yazl';
21
- import { k as cacheKeys, g as getShortUUID } from './baseGameCommand-BKvHM3h_.js';
18
+ import 'uuid';
19
+ import { k as cacheKeys, g as getShortUUID } from './baseGameCommand-CCyAhN-V.js';
22
20
  import 'socket.io-client';
23
21
  import 'fullscreen-ink';
22
+ import 'stream';
23
+ import 'yazl';
24
24
  import { T as Table } from './Table-FaNgpyeq.js';
25
25
  import { T as Title } from './Title-BCQtayg6.js';
26
26
 
@@ -1,4 +1,4 @@
1
- import { B as BaseAuthenticatedCommand } from './baseGameCommand-BKvHM3h_.js';
1
+ import { B as BaseAuthenticatedCommand } from './baseGameCommand-CCyAhN-V.js';
2
2
 
3
3
  class BaseAppleCommand extends BaseAuthenticatedCommand {
4
4
  async init() {
@@ -4,8 +4,6 @@ import path__default from 'node:path';
4
4
  import chalk from 'chalk';
5
5
  import { Flags, Command } from '@oclif/core';
6
6
  import axios from 'axios';
7
- import CryptoJS from 'crypto-js';
8
- import { v4 } from 'uuid';
9
7
  import { DateTime } from 'luxon';
10
8
  import * as expo from '@expo/apple-utils/build/index.js';
11
9
  import 'node:crypto';
@@ -17,10 +15,12 @@ import { getMajorVersion, loadExportPresets, findPreset, getBasePreset, saveExpo
17
15
  import { QueryClient } from '@tanstack/react-query';
18
16
  import 'react';
19
17
  import 'fast-glob';
20
- import 'yazl';
18
+ import 'uuid';
21
19
  import 'socket.io-client';
22
20
  import 'fullscreen-ink';
23
21
  import 'ink';
22
+ import 'stream';
23
+ import 'yazl';
24
24
 
25
25
  const AUTH_ENV_VAR_NAME = "SHIPTHIS_TOKEN";
26
26
  const DOMAIN_ENV_VAR_NAME = "SHIPTHIS_DOMAIN";
@@ -236,23 +236,12 @@ async function getSingleUseUrl(destination) {
236
236
  return url;
237
237
  }
238
238
  async function getShortAuthRequiredUrl(destination) {
239
- const { email } = await getSelf();
240
- const key = v4();
241
- const salt = "Na (s) + 1/2 Cl\u2082 (g) \u2192 NaCl (s)";
242
- const fullKey = `${key}${salt}`;
243
- const token = CryptoJS.AES.encrypt(email, fullKey).toString();
244
- const params = {
245
- destination,
246
- key,
247
- token
248
- };
249
- const queryString = Object.entries(params).map(([key2, value]) => `${key2}=${encodeURIComponent(`${value}`)}`).join("&");
250
- const url = `${WEB_URL}login/?${queryString}`;
251
239
  const headers = await getAuthedHeaders();
252
240
  const { data } = await axios.post(
253
- `${API_URL}/me/shorten`,
241
+ `${API_URL}/me/login-link`,
254
242
  {
255
- url
243
+ destination,
244
+ webUrl: WEB_URL
256
245
  },
257
246
  { headers }
258
247
  );
@@ -754,4 +743,4 @@ class BaseCommand extends Command {
754
743
  }
755
744
  }
756
745
 
757
- export { acceptTerms as $, ApiKey as A, BaseCommand as B, CredentialsType as C, DetailsFlags as D, getProjectJobs as E, getJob as F, GODOT_CAPABILITIES as G, castArrayObjectDates as H, queryClient as I, JobStatus as J, WS_URL as K, getAuthToken as L, getProjectPlatformProgress as M, downloadBuildById as N, getGoogleStatus as O, Platform as P, getGodotAndroidPackageName as Q, enforcePolicy as R, revokePolicy as S, inviteServiceAccount as T, UserRole as U, disconnectGoogle as V, WEB_URL as W, getAPIKeys as X, createAPIKey as Y, revokeAPIKey as Z, getSingleUseUrl as _, ApiKeyType as a, setAuthToken as a0, Auth as a1, getNewUploadTicket as a2, startJobsFromUpload as a3, LogLevel as a4, getShortAuthRequiredUrl as a5, castObjectDates as a6, getGoogleAuthUrl as a7, castJobDates as a8, getShortTime as a9, updateProject as aa, BuildType as ab, getGradleBuildOptionKey as ac, getShortDateTime as ad, getShortTimeDelta as ae, JobStage as af, getSelf as ag, getTerms as ah, Certificate as b, getShortDate as c, getGodotAppleBundleIdentifier as d, BundleId as e, App as f, getProjects as g, CapabilityTypeOption as h, isGradleBuildEnabled as i, BetaGroup as j, isCWDGodotGame as k, getProject as l, CertificateType as m, Profile as n, ProfileType as o, API_URL as p, getAuthedHeaders as q, getGodotProjectCapabilities as r, setGradleBuildEnabled as s, CapabilityType as t, GameEngine as u, getGodotVersion as v, createProject as w, DEFAULT_SHIPPED_FILES_GLOBS as x, DEFAULT_IGNORED_FILES_GLOBS as y, getGodotProjectName as z };
746
+ export { acceptTerms as $, ApiKey as A, BaseCommand as B, CredentialsType as C, DetailsFlags as D, getProjectJobs as E, getJob as F, GODOT_CAPABILITIES as G, castArrayObjectDates as H, queryClient as I, JobStatus as J, WS_URL as K, getAuthToken as L, getProjectPlatformProgress as M, downloadBuildById as N, getGoogleStatus as O, Platform as P, getGodotAndroidPackageName as Q, enforcePolicy as R, revokePolicy as S, inviteServiceAccount as T, UserRole as U, disconnectGoogle as V, WEB_URL as W, getAPIKeys as X, createAPIKey as Y, revokeAPIKey as Z, getSingleUseUrl as _, ApiKeyType as a, setAuthToken as a0, Auth as a1, LogLevel as a2, getShortAuthRequiredUrl as a3, getNewUploadTicket as a4, startJobsFromUpload as a5, castObjectDates as a6, getGoogleAuthUrl as a7, castJobDates as a8, getShortTime as a9, updateProject as aa, BuildType as ab, getGradleBuildOptionKey as ac, getShortDateTime as ad, getShortTimeDelta as ae, JobStage as af, getSelf as ag, getTerms as ah, Certificate as b, getShortDate as c, getGodotAppleBundleIdentifier as d, BundleId as e, App as f, getProjects as g, CapabilityTypeOption as h, isGradleBuildEnabled as i, BetaGroup as j, isCWDGodotGame as k, getProject as l, CertificateType as m, Profile as n, ProfileType as o, API_URL as p, getAuthedHeaders as q, getGodotProjectCapabilities as r, setGradleBuildEnabled as s, CapabilityType as t, GameEngine as u, getGodotVersion as v, createProject as w, DEFAULT_SHIPPED_FILES_GLOBS as x, DEFAULT_IGNORED_FILES_GLOBS as y, getGodotProjectName as z };
@@ -1,5 +1,5 @@
1
- import { O as getGoogleStatus, Q as getGodotAndroidPackageName } from './baseCommand-CscxrTMI.js';
2
- import { c as BaseGameCommand, d as generatePackageName, b as getInput } from './baseGameCommand-BKvHM3h_.js';
1
+ import { O as getGoogleStatus, Q as getGodotAndroidPackageName } from './baseCommand-CdsX3LS8.js';
2
+ import { c as BaseGameCommand, d as generatePackageName, b as getInput } from './baseGameCommand-CCyAhN-V.js';
3
3
 
4
4
  class BaseGameAndroidCommand extends BaseGameCommand {
5
5
  async checkGoogleAuth(waitForAuth = false) {