shipthis 0.1.42 → 0.1.43

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 (89) hide show
  1. package/README.md +8 -7
  2. package/dist/{AppleBundleIdDetails-jDq3gYbk.js → AppleBundleIdDetails-bMqPqmP0.js} +6 -5
  3. package/dist/{Command-cVo97lkQ.js → Command-cqn3WLlP.js} +4 -3
  4. package/dist/{CommandGame-BwudtYCO.js → CommandGame-DMQT0sL_.js} +2 -2
  5. package/dist/{Create-By4NsPEI.js → Create-Cs9HG9xO.js} +4 -3
  6. package/dist/{GameStatus-C59zQE1H.js → GameStatus-lv2SW-6H.js} +3 -3
  7. package/dist/{Import-DTcVM-T-.js → Import-DOQrR8wW.js} +5 -4
  8. package/dist/{JobLogTail-BzisGkY8.js → JobLogTail-CWYxQTq4.js} +5 -4
  9. package/dist/{JobProgress-DAnhaTho.js → JobProgress-B07Y2FLb.js} +140 -25
  10. package/dist/{JobStatusTable-BYEi8dtD.js → JobStatusTable-B0A1z1zq.js} +3 -4
  11. package/dist/{ProjectCredentialsTable-NZf3V39z.js → ProjectCredentialsTable-CyJ7o8yD.js} +4 -3
  12. package/dist/{UserCredentialsTable-Dp884nYO.js → UserCredentialsTable-C8_skPFY.js} +4 -3
  13. package/dist/{baseAppleCommand-DewNWX3L.js → baseAppleCommand-Cfoy8Tx_.js} +1 -1
  14. package/dist/{baseCommand-CscxrTMI.js → baseCommand-B23l0hCp.js} +3 -2
  15. package/dist/{baseGameAndroidCommand-CEcDz5P2.js → baseGameAndroidCommand-Dh4xXVW1.js} +2 -2
  16. package/dist/{baseGameCommand-BKvHM3h_.js → baseGameCommand-P7Vyz2vZ.js} +4 -3
  17. package/dist/commands/apiKey/create.js +5 -4
  18. package/dist/commands/apiKey/list.js +5 -4
  19. package/dist/commands/apiKey/revoke.js +5 -4
  20. package/dist/commands/apple/apiKey/create.js +8 -7
  21. package/dist/commands/apple/apiKey/delete.js +6 -5
  22. package/dist/commands/apple/apiKey/export.js +7 -6
  23. package/dist/commands/apple/apiKey/import.js +7 -6
  24. package/dist/commands/apple/apiKey/status.js +6 -5
  25. package/dist/commands/apple/certificate/create.js +8 -7
  26. package/dist/commands/apple/certificate/delete.js +6 -5
  27. package/dist/commands/apple/certificate/export.js +7 -6
  28. package/dist/commands/apple/certificate/import.js +7 -6
  29. package/dist/commands/apple/certificate/status.js +6 -5
  30. package/dist/commands/apple/login.js +4 -3
  31. package/dist/commands/apple/status.js +5 -4
  32. package/dist/commands/dashboard.js +4 -3
  33. package/dist/commands/game/android/apiKey/connect.js +10 -9
  34. package/dist/commands/game/android/apiKey/create.js +12 -11
  35. package/dist/commands/game/android/apiKey/delete.js +6 -5
  36. package/dist/commands/game/android/apiKey/export.js +8 -7
  37. package/dist/commands/game/android/apiKey/import.js +8 -7
  38. package/dist/commands/game/android/apiKey/invite.js +5 -4
  39. package/dist/commands/game/android/apiKey/policy.js +5 -4
  40. package/dist/commands/game/android/apiKey/status.js +8 -7
  41. package/dist/commands/game/android/keyStore/create.js +9 -8
  42. package/dist/commands/game/android/keyStore/delete.js +6 -5
  43. package/dist/commands/game/android/keyStore/export.js +7 -6
  44. package/dist/commands/game/android/keyStore/import.js +10 -9
  45. package/dist/commands/game/android/keyStore/status.js +7 -6
  46. package/dist/commands/game/android/status.js +4 -3
  47. package/dist/commands/game/build/download.js +5 -4
  48. package/dist/commands/game/build/list.js +6 -5
  49. package/dist/commands/game/create.js +4 -3
  50. package/dist/commands/game/details.js +5 -4
  51. package/dist/commands/game/export.js +4 -3
  52. package/dist/commands/game/ios/app/addTester.js +6 -5
  53. package/dist/commands/game/ios/app/create.js +5 -4
  54. package/dist/commands/game/ios/app/status.js +8 -7
  55. package/dist/commands/game/ios/app/sync.js +6 -5
  56. package/dist/commands/game/ios/profile/create.js +8 -7
  57. package/dist/commands/game/ios/profile/delete.js +6 -5
  58. package/dist/commands/game/ios/profile/export.js +7 -6
  59. package/dist/commands/game/ios/profile/import.js +7 -6
  60. package/dist/commands/game/ios/profile/status.js +8 -7
  61. package/dist/commands/game/ios/status.js +10 -9
  62. package/dist/commands/game/ios/wizard.js +5 -4
  63. package/dist/commands/game/job/list.js +5 -4
  64. package/dist/commands/game/job/status.js +8 -7
  65. package/dist/commands/game/list.js +5 -4
  66. package/dist/commands/game/ship.js +10 -9
  67. package/dist/commands/game/status.js +7 -6
  68. package/dist/commands/game/wizard.js +16 -15
  69. package/dist/commands/internal/fastlane.js +4 -3
  70. package/dist/commands/internal/readme.js +4 -3
  71. package/dist/commands/login.js +4 -3
  72. package/dist/commands/status.js +5 -4
  73. package/dist/commands/util/android-build-method.js +4 -3
  74. package/dist/commands/util/glass.js +3 -2
  75. package/dist/{export-DBQHSKU-.js → export-BOuZFMT3.js} +1 -1
  76. package/dist/{import-Bk4w8kks.js → import-P4KcAuAO.js} +1 -1
  77. package/dist/{index-WrVwh6le.js → index-AUjBYrSG.js} +7 -6
  78. package/dist/{index-zdIBXHs2.js → index-BmRSqi8U.js} +6 -5
  79. package/dist/{index-qOGviaGc.js → index-DMosmqi2.js} +1 -1
  80. package/dist/{upload-CeRPHRCP.js → upload-BvNeNQXc.js} +1 -1
  81. package/dist/{useAppleApp-DgZH0CBS.js → useAppleApp-fD92orhh.js} +1 -1
  82. package/dist/{useAppleBundleId-CA7Pg4Hi.js → useAppleBundleId-oONHtYgg.js} +1 -1
  83. package/dist/{useAppleProfiles-CUBTPbcC.js → useAppleProfiles-aMy844nZ.js} +3 -2
  84. package/dist/{useGoogleStatus-DpPwKmw_.js → useGoogleStatus-rBDZt9tw.js} +2 -2
  85. package/dist/{useProjectCredentials-rQLm2O1J.js → useProjectCredentials-DLYLMlJh.js} +2 -2
  86. package/dist/{useWebSocket-PU55rRGt.js → useWebSocket-Bvq2Wf7I.js} +1 -1
  87. package/npm-shrinkwrap.json +42 -41
  88. package/oclif.manifest.json +1 -1
  89. package/package.json +1 -1
package/README.md CHANGED
@@ -104,13 +104,14 @@ ShipThis handles iOS builds on managed macOS cloud servers. The CLI connects to
104
104
 
105
105
  We support **all stable Godot versions since 3.6**, including:
106
106
 
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) | | | | |
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) | [4.6](https://github.com/godotengine/godot/releases/tag/4.6-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) | | | | | |
114
+
114
115
 
115
116
  **\* 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
117
 
@@ -11,28 +11,29 @@ import 'readline-sync';
11
11
  import 'luxon';
12
12
  import 'axios';
13
13
  import 'isomorphic-git';
14
- import './baseCommand-CscxrTMI.js';
14
+ import './baseCommand-B23l0hCp.js';
15
15
  import '@oclif/core';
16
16
  import '@tanstack/react-query';
17
17
  import 'react';
18
18
  import 'crypto-js';
19
19
  import 'uuid';
20
- import { u as useAppleApp } from './useAppleApp-DgZH0CBS.js';
20
+ import { u as useAppleApp } from './useAppleApp-fD92orhh.js';
21
21
  import 'fast-glob';
22
- import 'yazl';
23
22
  import 'socket.io-client';
24
23
  import 'fullscreen-ink';
24
+ import 'stream';
25
+ import 'yazl';
25
26
  import 'string-length';
26
27
  import 'strip-ansi';
27
28
  import { T as Table } from './Table-FaNgpyeq.js';
28
29
  import { T as Title } from './Title-BCQtayg6.js';
29
30
  import 'open';
30
- import './baseGameCommand-BKvHM3h_.js';
31
+ import './baseGameCommand-P7Vyz2vZ.js';
31
32
  import 'godot-export-presets';
32
33
  import 'marked';
33
34
  import 'marked-terminal';
34
35
  import 'qrcode';
35
- import { u as useAppleBundleId } from './useAppleBundleId-CA7Pg4Hi.js';
36
+ import { u as useAppleBundleId } from './useAppleBundleId-oONHtYgg.js';
36
37
 
37
38
  const AppleAppDetails = (props) => {
38
39
  const { data, isLoading } = useAppleApp(props);
@@ -2,7 +2,7 @@ import { jsx } from 'react/jsx-runtime';
2
2
  import { QueryClientProvider } from '@tanstack/react-query';
3
3
  import { useScreenSize } from 'fullscreen-ink';
4
4
  import { Box } from 'ink';
5
- import { I as queryClient } from './baseCommand-CscxrTMI.js';
5
+ import { I as queryClient } from './baseCommand-B23l0hCp.js';
6
6
  import 'axios';
7
7
  import 'node:fs';
8
8
  import 'crypto-js';
@@ -17,9 +17,10 @@ import 'isomorphic-git';
17
17
  import '@oclif/core';
18
18
  import 'react';
19
19
  import 'socket.io-client';
20
- import 'fast-glob';
20
+ import 'stream';
21
21
  import 'yazl';
22
- import { C as CommandProvider } from './baseGameCommand-BKvHM3h_.js';
22
+ import 'fast-glob';
23
+ import { C as CommandProvider } from './baseGameCommand-P7Vyz2vZ.js';
23
24
 
24
25
  const Command = ({ children, command }) => {
25
26
  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-P7Vyz2vZ.js';
3
+ import { C as Command } from './Command-cqn3WLlP.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-B23l0hCp.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-P7Vyz2vZ.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-B23l0hCp.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-P7Vyz2vZ.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,26 @@ 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-B23l0hCp.js';
15
15
  import '@oclif/core';
16
16
  import { useMutation } from '@tanstack/react-query';
17
17
  import 'crypto-js';
18
18
  import { v4 } from 'uuid';
19
19
  import 'fast-glob';
20
- import { ZipFile } from 'yazl';
21
20
  import 'socket.io-client';
22
21
  import 'fullscreen-ink';
22
+ import 'stream';
23
+ import { ZipFile } from 'yazl';
23
24
  import 'string-length';
24
25
  import 'strip-ansi';
25
26
  import 'open';
26
27
  import '@inkjs/ui';
27
- import { k as cacheKeys, i as GameContext } from './baseGameCommand-BKvHM3h_.js';
28
+ import { k as cacheKeys, i as GameContext } from './baseGameCommand-P7Vyz2vZ.js';
28
29
  import 'marked';
29
30
  import 'marked-terminal';
30
31
  import 'qrcode';
31
32
  import 'godot-export-presets';
32
- import { i as importCredential } from './import-Bk4w8kks.js';
33
+ import { i as importCredential } from './import-P4KcAuAO.js';
33
34
 
34
35
  async function importKeystore({ log = () => {
35
36
  }, ...opt }) {
@@ -7,7 +7,7 @@ import { useState, useRef, useEffect } from 'react';
7
7
  import 'node:fs';
8
8
  import 'crypto-js';
9
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';
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-B23l0hCp.js';
11
11
  import 'luxon';
12
12
  import 'node:crypto';
13
13
  import 'node:path';
@@ -16,12 +16,13 @@ import 'node:url';
16
16
  import 'readline-sync';
17
17
  import 'isomorphic-git';
18
18
  import '@oclif/core';
19
- import 'fast-glob';
19
+ import 'stream';
20
20
  import 'yazl';
21
+ import 'fast-glob';
21
22
  import 'socket.io-client';
22
- import { k as cacheKeys, y as useJob, h as getStageColor, u as getMessageColor } from './baseGameCommand-BKvHM3h_.js';
23
+ import { k as cacheKeys, y as useJob, h as getStageColor, x as getMessageColor } from './baseGameCommand-P7Vyz2vZ.js';
23
24
  import 'fullscreen-ink';
24
- import { u as useWebSocket } from './useWebSocket-PU55rRGt.js';
25
+ import { u as useWebSocket } from './useWebSocket-Bvq2Wf7I.js';
25
26
  import { T as Title } from './Title-BCQtayg6.js';
26
27
  import stringLength from 'string-length';
27
28
  import stripAnsi from 'strip-ansi';
@@ -1,20 +1,21 @@
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-B23l0hCp.js';
6
+ import { k as cacheKeys, v as getFileHash, w as getPlatformName, x as getMessageColor } from './baseGameCommand-P7Vyz2vZ.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 'axios';
14
15
  import 'crypto-js';
15
16
  import 'luxon';
16
17
  import 'socket.io-client';
17
- import { u as useJobWatching, a as JobLogLine } from './JobLogTail-BzisGkY8.js';
18
+ import { u as useJobWatching, a as JobLogLine } from './JobLogTail-CWYxQTq4.js';
18
19
  import 'fullscreen-ink';
19
20
  import 'open';
20
21
  import '@inkjs/ui';
@@ -27,6 +28,15 @@ import 'string-length';
27
28
  import 'strip-ansi';
28
29
  import 'godot-export-presets';
29
30
 
31
+ function formatProgressLog(label, data, bytesKey, totalKey, isEstimated = false) {
32
+ const elapsed = data.elapsedSeconds.toFixed(1);
33
+ const transferredMB = (data[bytesKey] / 1024 / 1024).toFixed(2);
34
+ const totalMB = (data[totalKey] / 1024 / 1024).toFixed(2);
35
+ const progressPercent = Math.round(data.progress * 100);
36
+ const speed = data.speedMBps.toFixed(2);
37
+ const totalPrefix = isEstimated ? "~" : "";
38
+ return `${label}: ${progressPercent}% (${transferredMB}MB / ${totalPrefix}${totalMB}MB) - ${elapsed}s - ${speed}MB/s`;
39
+ }
30
40
  async function ship({ command, log = () => {
31
41
  }, shipFlags }) {
32
42
  const commandFlags = command.getFlags();
@@ -51,34 +61,39 @@ async function ship({ command, log = () => {
51
61
  verbose && log("Finding files to include in zip...");
52
62
  const files = await fg(shippedFilesGlobs, { dot: true, ignore: ignoredFilesGlobs });
53
63
  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();
64
+ const tmpZipFileName = `shipthis-${v4()}.zip`;
65
+ const tmpZipFile = `${process.cwd()}/${tmpZipFileName}`;
66
+ log(`Creating zip file: ${tmpZipFileName}`);
67
+ await createZip({
68
+ files,
69
+ outputPath: tmpZipFile,
70
+ onProgress: (data) => {
71
+ log(formatProgressLog("Zipping", data, "writtenBytes", "estimatedTotalBytes", true));
72
+ }
62
73
  });
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
74
  const { size } = fs__default.statSync(tmpZipFile);
69
75
  verbose && log("Requesting upload ticket...");
70
76
  const uploadTicket = await getNewUploadTicket(projectConfig.project.id);
71
77
  log("Uploading zip file...");
72
- await axios.put(uploadTicket.url, zipBuffer, {
73
- headers: {
74
- "Content-Type": "application/zip",
75
- "Content-length": size
78
+ const zipStream = fs__default.createReadStream(tmpZipFile);
79
+ const response = await uploadZip({
80
+ url: uploadTicket.url,
81
+ zipStream,
82
+ zipSize: size,
83
+ onProgress: (data) => {
84
+ log(formatProgressLog("Uploading", data, "loadedBytes", "totalBytes", false));
76
85
  }
77
86
  });
87
+ verbose && log("Computing zip file hash...");
88
+ const zipFileMd5 = await getFileHash(tmpZipFile);
89
+ verbose && log("Cleaning up temporary zip file...");
90
+ fs__default.unlinkSync(tmpZipFile);
91
+ if (!response.ok) {
92
+ throw new Error(`Upload failed: ${response.status} ${response.statusText}`);
93
+ }
94
+ log(`Upload complete`);
78
95
  verbose && log("Fetching Git info...");
79
96
  const gitInfo = await getCWDGitInfo();
80
- verbose && log("Computing file hash...");
81
- const zipFileMd5 = await getFileHash(tmpZipFile);
82
97
  const uploadDetails = {
83
98
  ...gitInfo,
84
99
  zipFileMd5
@@ -93,8 +108,6 @@ async function ship({ command, log = () => {
93
108
  gameEngineVersion: finalFlags.gameEngineVersion
94
109
  };
95
110
  const jobs = await startJobsFromUpload(uploadTicket.id, startJobsOptions);
96
- verbose && log("Cleaning up temporary zip file...");
97
- fs__default.unlinkSync(tmpZipFile);
98
111
  verbose && log("Job submission complete.");
99
112
  if (jobs.length === 0) {
100
113
  throw new Error("No jobs were created. Please check your game configuration and try again.");
@@ -113,6 +126,108 @@ const useShip = () => useMutation({
113
126
  }
114
127
  });
115
128
 
129
+ const ON_PROGRESS_THROTTLE_MS = 2e3;
130
+ function createProgressStream(totalSize, onProgress, throttleMs) {
131
+ let sent = 0;
132
+ let lastCallTime = 0;
133
+ return new Transform({
134
+ transform(chunk, encoding, callback) {
135
+ sent += chunk.length;
136
+ const now = Date.now();
137
+ if (now - lastCallTime >= throttleMs) {
138
+ onProgress(sent, totalSize);
139
+ lastCallTime = now;
140
+ }
141
+ callback(null, chunk);
142
+ }
143
+ });
144
+ }
145
+ function uploadZip({ url, zipStream, zipSize, onProgress }) {
146
+ const startTime = Date.now();
147
+ const progressStream = createProgressStream(zipSize, (sent, total) => {
148
+ const elapsedSeconds = (Date.now() - startTime) / 1e3;
149
+ const speedMBps = elapsedSeconds < 1e-3 ? 0 : sent / elapsedSeconds / 1024 / 1024;
150
+ onProgress({
151
+ progress: total ? sent / total : 0,
152
+ loadedBytes: sent,
153
+ totalBytes: total,
154
+ speedMBps,
155
+ elapsedSeconds
156
+ });
157
+ }, ON_PROGRESS_THROTTLE_MS);
158
+ const streamWithProgress = zipStream.pipe(progressStream);
159
+ const webStream = Readable.toWeb(streamWithProgress);
160
+ const response = fetch(url, {
161
+ method: "PUT",
162
+ headers: {
163
+ "Content-Type": "application/zip",
164
+ "Content-Length": zipSize.toString()
165
+ },
166
+ body: webStream,
167
+ duplex: "half"
168
+ });
169
+ return response;
170
+ }
171
+
172
+ const COMPRESSION_RATIO = 0.65;
173
+ async function createZip({ files, outputPath, onProgress }) {
174
+ const startTime = Date.now();
175
+ const statPromises = files.map(async (file) => {
176
+ try {
177
+ return await fs__default.promises.stat(file);
178
+ } catch {
179
+ return null;
180
+ }
181
+ });
182
+ const statsResults = await Promise.all(statPromises);
183
+ let totalSourceSize = 0;
184
+ for (const stats of statsResults) {
185
+ if (stats) {
186
+ totalSourceSize += stats.size;
187
+ }
188
+ }
189
+ const estimatedZipSize = Math.max(Math.round(totalSourceSize * COMPRESSION_RATIO), 1);
190
+ const zipFile = new ZipFile();
191
+ for (const file of files) {
192
+ zipFile.addFile(file, file);
193
+ }
194
+ return new Promise((resolve, reject) => {
195
+ let settled = false;
196
+ const handleError = (error) => {
197
+ if (settled) return;
198
+ settled = true;
199
+ zipFile.outputStream.destroy();
200
+ progressStream.destroy();
201
+ outputStream.destroy();
202
+ reject(error);
203
+ };
204
+ const handleSuccess = () => {
205
+ if (settled) return;
206
+ settled = true;
207
+ resolve();
208
+ };
209
+ const outputStream = fs__default.createWriteStream(outputPath);
210
+ const progressStream = createProgressStream(estimatedZipSize, (written, total) => {
211
+ const elapsedSeconds = (Date.now() - startTime) / 1e3;
212
+ const speedMBps = elapsedSeconds < 1e-3 ? 0 : written / elapsedSeconds / 1024 / 1024;
213
+ onProgress({
214
+ progress: total ? Math.min(1, written / total) : 0,
215
+ writtenBytes: written,
216
+ estimatedTotalBytes: total,
217
+ sourceTotalBytes: totalSourceSize,
218
+ elapsedSeconds,
219
+ speedMBps
220
+ });
221
+ }, ON_PROGRESS_THROTTLE_MS);
222
+ zipFile.outputStream.on("error", handleError);
223
+ progressStream.on("error", handleError);
224
+ outputStream.on("error", handleError);
225
+ outputStream.on("close", handleSuccess);
226
+ zipFile.outputStream.pipe(progressStream).pipe(outputStream);
227
+ zipFile.end();
228
+ });
229
+ }
230
+
116
231
  const JobProgress = (props) => {
117
232
  const [lastWarningLog, setLastWarningLog] = useState(null);
118
233
  const { progress } = useJobWatching({
@@ -3,17 +3,16 @@ 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-B23l0hCp.js';
7
7
  import '@tanstack/react-query';
8
8
  import 'axios';
9
9
  import 'node:fs';
10
10
  import 'crypto-js';
11
11
  import 'uuid';
12
- import { e as getJobSummary, h as getStageColor, f as getJobStatusColor } from './baseGameCommand-BKvHM3h_.js';
12
+ import { e as getJobSummary, h as getStageColor, f as getJobStatusColor } from './baseGameCommand-P7Vyz2vZ.js';
13
13
  import 'fast-glob';
14
- import 'yazl';
15
14
  import 'socket.io-client';
16
- import { u as useJobWatching } from './JobLogTail-BzisGkY8.js';
15
+ import { u as useJobWatching } from './JobLogTail-CWYxQTq4.js';
17
16
  import 'fullscreen-ink';
18
17
  import { a as StatusRow, b as StatusRowLabel } from './StatusTable-DzRWcMr4.js';
19
18
  import { T as Title } from './Title-BCQtayg6.js';
@@ -10,17 +10,18 @@ import 'readline-sync';
10
10
  import 'luxon';
11
11
  import 'axios';
12
12
  import 'isomorphic-git';
13
- import './baseCommand-CscxrTMI.js';
13
+ import './baseCommand-B23l0hCp.js';
14
14
  import '@oclif/core';
15
15
  import '@tanstack/react-query';
16
16
  import 'react';
17
17
  import 'crypto-js';
18
18
  import 'uuid';
19
- import { u as useProjectCredentials, g as getProjectCredentialSummary } from './useProjectCredentials-rQLm2O1J.js';
19
+ import { u as useProjectCredentials, g as getProjectCredentialSummary } from './useProjectCredentials-DLYLMlJh.js';
20
20
  import 'fast-glob';
21
- import 'yazl';
22
21
  import 'socket.io-client';
23
22
  import 'fullscreen-ink';
23
+ import 'stream';
24
+ import 'yazl';
24
25
  import { T as Table } from './Table-FaNgpyeq.js';
25
26
  import { T as Title } from './Title-BCQtayg6.js';
26
27
 
@@ -10,17 +10,18 @@ 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-B23l0hCp.js';
14
14
  import '@oclif/core';
15
15
  import { useQuery } from '@tanstack/react-query';
16
16
  import 'react';
17
17
  import 'crypto-js';
18
18
  import 'uuid';
19
19
  import 'fast-glob';
20
- import 'yazl';
21
- import { k as cacheKeys, g as getShortUUID } from './baseGameCommand-BKvHM3h_.js';
20
+ import { k as cacheKeys, g as getShortUUID } from './baseGameCommand-P7Vyz2vZ.js';
22
21
  import 'socket.io-client';
23
22
  import 'fullscreen-ink';
23
+ import 'stream';
24
+ import 'yazl';
24
25
  import { T as Table } from './Table-FaNgpyeq.js';
25
26
  import { T as Title } from './Title-BCQtayg6.js';
26
27
 
@@ -1,4 +1,4 @@
1
- import { B as BaseAuthenticatedCommand } from './baseGameCommand-BKvHM3h_.js';
1
+ import { B as BaseAuthenticatedCommand } from './baseGameCommand-P7Vyz2vZ.js';
2
2
 
3
3
  class BaseAppleCommand extends BaseAuthenticatedCommand {
4
4
  async init() {
@@ -17,10 +17,11 @@ import { getMajorVersion, loadExportPresets, findPreset, getBasePreset, saveExpo
17
17
  import { QueryClient } from '@tanstack/react-query';
18
18
  import 'react';
19
19
  import 'fast-glob';
20
- import 'yazl';
21
20
  import 'socket.io-client';
22
21
  import 'fullscreen-ink';
23
22
  import 'ink';
23
+ import 'stream';
24
+ import 'yazl';
24
25
 
25
26
  const AUTH_ENV_VAR_NAME = "SHIPTHIS_TOKEN";
26
27
  const DOMAIN_ENV_VAR_NAME = "SHIPTHIS_DOMAIN";
@@ -754,4 +755,4 @@ class BaseCommand extends Command {
754
755
  }
755
756
  }
756
757
 
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 };
758
+ 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-B23l0hCp.js';
2
+ import { c as BaseGameCommand, d as generatePackageName, b as getInput } from './baseGameCommand-P7Vyz2vZ.js';
3
3
 
4
4
  class BaseGameAndroidCommand extends BaseGameCommand {
5
5
  async checkGoogleAuth(waitForAuth = false) {
@@ -1,5 +1,5 @@
1
1
  import { Flags } from '@oclif/core';
2
- import { p as API_URL, q as getAuthedHeaders, P as Platform, ad as getShortDateTime, H as castArrayObjectDates, J as JobStatus, ae as getShortTimeDelta, F as getJob, af as JobStage, a4 as LogLevel, l as getProject, a5 as getShortAuthRequiredUrl, I as queryClient, ab as BuildType, W as WEB_URL, B as BaseCommand, ag as getSelf, ah as getTerms, aa as updateProject } from './baseCommand-CscxrTMI.js';
2
+ import { p as API_URL, q as getAuthedHeaders, P as Platform, ad as getShortDateTime, H as castArrayObjectDates, J as JobStatus, ae as getShortTimeDelta, F as getJob, af as JobStage, a2 as LogLevel, l as getProject, a3 as getShortAuthRequiredUrl, I as queryClient, ab as BuildType, W as WEB_URL, B as BaseCommand, ag as getSelf, ah as getTerms, aa as updateProject } from './baseCommand-B23l0hCp.js';
3
3
  import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
4
4
  import { useStdin, useInput, Text, Box } from 'ink';
5
5
  import Spinner from 'ink-spinner';
@@ -16,9 +16,10 @@ import { useQuery } from '@tanstack/react-query';
16
16
  import React, { useState, useEffect, useContext, useRef } from 'react';
17
17
  import 'fast-glob';
18
18
  import 'uuid';
19
- import 'yazl';
20
19
  import 'socket.io-client';
21
20
  import 'fullscreen-ink';
21
+ import 'stream';
22
+ import 'yazl';
22
23
  import 'string-length';
23
24
  import 'strip-ansi';
24
25
  import open from 'open';
@@ -1173,4 +1174,4 @@ class BaseGameCommand extends BaseAuthenticatedCommand {
1173
1174
  }
1174
1175
  }
1175
1176
 
1176
- export { CreateGooglePlayGame as A, BaseAuthenticatedCommand as B, CommandProvider as C, GameProvider as G, KeyTestStatus as K, Markdown as M, getRenderedMarkdown as a, getInput as b, BaseGameCommand as c, generatePackageName as d, getJobSummary as e, getJobStatusColor as f, getShortUUID as g, getStageColor as h, GameContext as i, CommandContext as j, cacheKeys as k, isValidSemVer as l, makeHumanReadable as m, fetchKeyTestResult as n, niceError as o, KeyTestError as p, ejs as q, getMaskedInput as r, getFileHash as s, getPlatformName as t, getMessageColor as u, useBuilds as v, getBuildSummary as w, useSafeInput as x, useJob as y, queryBuilds as z };
1177
+ export { CreateGooglePlayGame as A, BaseAuthenticatedCommand as B, CommandProvider as C, GameProvider as G, KeyTestStatus as K, Markdown as M, getRenderedMarkdown as a, getInput as b, BaseGameCommand as c, generatePackageName as d, getJobSummary as e, getJobStatusColor as f, getShortUUID as g, getStageColor as h, GameContext as i, CommandContext as j, cacheKeys as k, isValidSemVer as l, makeHumanReadable as m, fetchKeyTestResult as n, niceError as o, KeyTestError as p, ejs as q, getMaskedInput as r, getBuildSummary as s, useSafeInput as t, useBuilds as u, getFileHash as v, getPlatformName as w, getMessageColor as x, useJob as y, queryBuilds as z };
@@ -2,8 +2,8 @@ import { jsx } from 'react/jsx-runtime';
2
2
  import { Flags } from '@oclif/core';
3
3
  import { render } from 'ink';
4
4
  import { v4 } from 'uuid';
5
- import { Y as createAPIKey, c as getShortDate } from '../../baseCommand-CscxrTMI.js';
6
- import { B as BaseAuthenticatedCommand, g as getShortUUID, a as getRenderedMarkdown } from '../../baseGameCommand-BKvHM3h_.js';
5
+ import { Y as createAPIKey, c as getShortDate } from '../../baseCommand-B23l0hCp.js';
6
+ import { B as BaseAuthenticatedCommand, g as getShortUUID, a as getRenderedMarkdown } from '../../baseGameCommand-P7Vyz2vZ.js';
7
7
  import 'node:fs';
8
8
  import 'node:path';
9
9
  import 'chalk';
@@ -13,7 +13,6 @@ import '@tanstack/react-query';
13
13
  import 'axios';
14
14
  import 'luxon';
15
15
  import 'fast-glob';
16
- import 'yazl';
17
16
  import 'socket.io-client';
18
17
  import 'fullscreen-ink';
19
18
  import 'string-length';
@@ -23,7 +22,8 @@ import '@inkjs/ui';
23
22
  import 'qrcode';
24
23
  import { R as RunWithSpinner } from '../../RunWithSpinner-DucRnFp6.js';
25
24
  import 'godot-export-presets';
26
- import { C as Command } from '../../Command-cVo97lkQ.js';
25
+ import 'yazl';
26
+ import { C as Command } from '../../Command-cqn3WLlP.js';
27
27
  import 'crypto-js';
28
28
  import '@expo/apple-utils/build/index.js';
29
29
  import 'node:crypto';
@@ -31,6 +31,7 @@ import 'node:readline';
31
31
  import 'node:url';
32
32
  import 'readline-sync';
33
33
  import 'isomorphic-git';
34
+ import 'stream';
34
35
  import 'fs';
35
36
  import 'path';
36
37
  import 'marked';