shipthis 0.1.39 → 0.1.42

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 (94) hide show
  1. package/README.md +58 -0
  2. package/assets/markdown/confirm-change-android-build-method.md.ejs +13 -0
  3. package/dist/{AppleBundleIdDetails-Ck7iAjMb.js → AppleBundleIdDetails-jDq3gYbk.js} +7 -5
  4. package/dist/{Command-C84QiOWP.js → Command-cVo97lkQ.js} +2 -1
  5. package/dist/{CommandGame-CsM9GE5Q.js → CommandGame-BwudtYCO.js} +2 -2
  6. package/dist/{Create-Dx1nEKmS.js → Create-By4NsPEI.js} +3 -1
  7. package/dist/{GameStatus-B4WBgoLs.js → GameStatus-C59zQE1H.js} +3 -1
  8. package/dist/{Import-BC5XgwRT.js → Import-DTcVM-T-.js} +4 -2
  9. package/dist/{JobLogTail-mBXpeWMu.js → JobLogTail-BzisGkY8.js} +30 -16
  10. package/dist/{JobProgress-KZ6EkMFi.js → JobProgress-DAnhaTho.js} +21 -9
  11. package/dist/{JobStatusTable-BYIxTt0d.js → JobStatusTable-BYEi8dtD.js} +3 -2
  12. package/dist/{ProjectCredentialsTable-DSy1YIWX.js → ProjectCredentialsTable-NZf3V39z.js} +2 -2
  13. package/dist/{UserCredentialsTable-qNByRE84.js → UserCredentialsTable-Dp884nYO.js} +2 -1
  14. package/dist/{baseAppleCommand-CdROzhyU.js → baseAppleCommand-DewNWX3L.js} +1 -1
  15. package/dist/baseCommand-CscxrTMI.js +757 -0
  16. package/dist/{baseGameAndroidCommand-B21zS0MN.js → baseGameAndroidCommand-CEcDz5P2.js} +4 -2
  17. package/dist/{index-Cv-92xRd.js → baseGameCommand-BKvHM3h_.js} +19 -755
  18. package/dist/commands/apiKey/create.js +7 -7
  19. package/dist/commands/apiKey/list.js +7 -7
  20. package/dist/commands/apiKey/revoke.js +7 -7
  21. package/dist/commands/apple/apiKey/create.js +14 -14
  22. package/dist/commands/apple/apiKey/delete.js +8 -8
  23. package/dist/commands/apple/apiKey/export.js +14 -14
  24. package/dist/commands/apple/apiKey/import.js +14 -14
  25. package/dist/commands/apple/apiKey/status.js +13 -13
  26. package/dist/commands/apple/certificate/create.js +14 -14
  27. package/dist/commands/apple/certificate/delete.js +8 -8
  28. package/dist/commands/apple/certificate/export.js +14 -14
  29. package/dist/commands/apple/certificate/import.js +14 -14
  30. package/dist/commands/apple/certificate/status.js +13 -13
  31. package/dist/commands/apple/login.js +5 -5
  32. package/dist/commands/apple/status.js +13 -13
  33. package/dist/commands/dashboard.js +8 -8
  34. package/dist/commands/game/android/apiKey/connect.js +12 -12
  35. package/dist/commands/game/android/apiKey/create.js +14 -14
  36. package/dist/commands/game/android/apiKey/delete.js +7 -7
  37. package/dist/commands/game/android/apiKey/export.js +14 -14
  38. package/dist/commands/game/android/apiKey/import.js +14 -14
  39. package/dist/commands/game/android/apiKey/invite.js +20 -20
  40. package/dist/commands/game/android/apiKey/policy.js +9 -9
  41. package/dist/commands/game/android/apiKey/status.js +14 -14
  42. package/dist/commands/game/android/keyStore/create.js +11 -11
  43. package/dist/commands/game/android/keyStore/delete.js +7 -7
  44. package/dist/commands/game/android/keyStore/export.js +13 -13
  45. package/dist/commands/game/android/keyStore/import.js +16 -16
  46. package/dist/commands/game/android/keyStore/status.js +16 -16
  47. package/dist/commands/game/android/status.js +6 -6
  48. package/dist/commands/game/build/download.js +7 -7
  49. package/dist/commands/game/build/list.js +12 -12
  50. package/dist/commands/game/create.js +5 -5
  51. package/dist/commands/game/details.js +16 -13
  52. package/dist/commands/game/export.js +5 -5
  53. package/dist/commands/game/ios/app/addTester.js +9 -9
  54. package/dist/commands/game/ios/app/create.js +10 -9
  55. package/dist/commands/game/ios/app/status.js +14 -14
  56. package/dist/commands/game/ios/app/sync.js +12 -12
  57. package/dist/commands/game/ios/profile/create.js +10 -10
  58. package/dist/commands/game/ios/profile/delete.js +8 -8
  59. package/dist/commands/game/ios/profile/export.js +13 -13
  60. package/dist/commands/game/ios/profile/import.js +13 -13
  61. package/dist/commands/game/ios/profile/status.js +14 -14
  62. package/dist/commands/game/ios/status.js +18 -18
  63. package/dist/commands/game/ios/wizard.js +8 -8
  64. package/dist/commands/game/job/list.js +7 -7
  65. package/dist/commands/game/job/status.js +14 -14
  66. package/dist/commands/game/list.js +7 -7
  67. package/dist/commands/game/ship.js +30 -13
  68. package/dist/commands/game/status.js +14 -14
  69. package/dist/commands/game/wizard.js +87 -37
  70. package/dist/commands/internal/fastlane.js +13 -13
  71. package/dist/commands/internal/readme.js +17 -17
  72. package/dist/commands/login.js +21 -21
  73. package/dist/commands/status.js +10 -10
  74. package/dist/commands/util/android-build-method.js +66 -0
  75. package/dist/commands/util/glass.js +118 -0
  76. package/dist/{export-BtUjg3Tl.js → export-DBQHSKU-.js} +1 -1
  77. package/dist/{import-BYSkF-tX.js → import-Bk4w8kks.js} +1 -1
  78. package/dist/{index-CcGRePRU.js → index-WrVwh6le.js} +6 -4
  79. package/dist/{index-Du6l7ZyV.js → index-qOGviaGc.js} +1 -1
  80. package/dist/{index-CgGLBt2v.js → index-zdIBXHs2.js} +5 -3
  81. package/dist/{upload-LoVBuJbT.js → upload-CeRPHRCP.js} +1 -1
  82. package/dist/{useAppleApp-Bg0x6s97.js → useAppleApp-DgZH0CBS.js} +1 -1
  83. package/dist/{useAppleBundleId-CEOssLqN.js → useAppleBundleId-CA7Pg4Hi.js} +2 -2
  84. package/dist/{useAppleProfiles-CHf_gHdZ.js → useAppleProfiles-CUBTPbcC.js} +1 -1
  85. package/dist/{useGoogleStatus-Ch36GbVo.js → useGoogleStatus-DpPwKmw_.js} +2 -1
  86. package/dist/{useProjectCredentials-CsQWPdyo.js → useProjectCredentials-rQLm2O1J.js} +2 -1
  87. package/dist/{useWebSocket-CWeaaLqi.js → useWebSocket-PU55rRGt.js} +1 -1
  88. package/docs/README.md +1 -0
  89. package/docs/util/android-build-method.md +26 -0
  90. package/docs/util/glass.md +47 -0
  91. package/docs/util.md +12 -0
  92. package/npm-shrinkwrap.json +14181 -0
  93. package/oclif.manifest.json +2966 -0
  94. package/package.json +11 -6
package/README.md CHANGED
@@ -334,6 +334,17 @@ For GitHub users, we provide an official **GitHub Action** for easy integration:
334
334
 
335
335
  See the [API Keys documentation](https://shipth.is/docs/reference/apiKey/?ref=github_readme) for more information.
336
336
 
337
+ ### Can I use a Liquid Glass icon with my game on iOS?
338
+
339
+ ShipThis enables the use of Liquid Glass icons with your game. These can be applied in two ways:
340
+
341
+ - To a local iOS export of a Godot project
342
+ - using the command `shipthis util glass ios/output.xcodeproj MyIcon.icon`
343
+ - To a game built using the ShipThis build servers
344
+ - using the command `shipthis game details --liquidGlassIconPath ./Example.icon`
345
+
346
+ You can read more in our [Liquid Glass icons guide](https://shipth.is/docs/guides/liquid-glass?ref=github_readme).
347
+
337
348
  ### How are my credentials stored and secured?
338
349
 
339
350
  ShipThis uses short-lived, signed URLs and ephemeral build environments.
@@ -351,6 +362,52 @@ We store:
351
362
  - App Store Connect API keys
352
363
  - iOS distribution certificates
353
364
 
365
+ ### What happens to my files when I run the command `shipthis game ship`?
366
+
367
+ #### 1. Uploading your game files
368
+
369
+ When you run the command, the CLI asks the ShipThis backend for a secure (HTTPS) temporary upload URL.
370
+ Your game files are packaged locally on your machine:
371
+
372
+ - Files matching `shippedFilesGlobs` in `shipthis.json` are included
373
+ - Files matching `ignoredFilesGlobs` are excluded
374
+
375
+ The zip file is then uploaded directly from your computer to a private DigitalOcean Space using the temporary upload URL.
376
+
377
+ #### 2. Where the files are stored
378
+
379
+ The uploaded zip lives in a private DigitalOcean Space. The space is not public and cannot be browsed.
380
+
381
+ Files in this storage can only be accessed using signed URLs that expire after a short time. Those URLs are generated only when they are needed.
382
+
383
+ This storage is used for:
384
+
385
+ - Providing a build machine access to your game files
386
+ - Storing the resulting build outputs (APK/AAB/IPA)
387
+
388
+ #### 3. How build machines access your code
389
+
390
+ Build machines do not have general access to storage of game files or credentials.
391
+
392
+ When a machine is ready to run a job, it asks the backend for work. The job it receives includes a temporary, signed download URL for the zip containing the game files. The machine downloads the zip, extracts it, runs the build, and uploads the results using signed upload URLs provided in the job metadata.
393
+
394
+ Build machines cannot browse files or access anything outside the job that they are currently running.
395
+
396
+ #### 4. Cleanup after the build
397
+
398
+ After a build machine has completed a job, a cleanup routine is run which deletes:
399
+
400
+ - Downloaded and extracted game files
401
+ - Build intermediates
402
+ - Temporary files
403
+
404
+ The build machines do not keep user files after a job completes.
405
+
406
+ #### 5. Retention and deletion
407
+
408
+ - Uploaded game file zips and build outputs (APK/AAB/IPA) are retained for **30 days**
409
+ - A lifecycle policy set on the storage automatically deletes them after that period
410
+
354
411
  ## 📖 Command Reference
355
412
 
356
413
  ### 🗂 Topics
@@ -358,6 +415,7 @@ We store:
358
415
  - [apiKey](https://shipth.is/docs/reference/apiKey?ref=github_readme) - Commands related to ShipThis API Keys
359
416
  - [apple](https://shipth.is/docs/reference/apple?ref=github_readme) - Commands that relate to linking your ShipThis account with your Apple Developer account
360
417
  - [game](https://shipth.is/docs/reference/game?ref=github_readme) - Commands that relate to configuring the specific game in the current working directory.
418
+ - [util](https://shipth.is/docs/reference/util?ref=github_readme) - Utility commands that do not require authentication
361
419
 
362
420
  ### 🔧 Commands
363
421
 
@@ -0,0 +1,13 @@
1
+ # Confirm change to export_presets.cfg
2
+
3
+ **In order to publish your game on Google Play, an edit must be made to your `export_presets.cfg` file to enable the Gradle build method.**
4
+
5
+ This change is necessary because Google Play requires Android App Bundles (AAB files) for new apps, and the Gradle build method is needed to create AAB files.
6
+
7
+ You can read more about this in the **ShipThis Documentation** [<%= docsURL %>](<%= docsURL %>)
8
+
9
+ You are using Godot version **<%= godotVersion %>**, ShipThis will update the **<%= optionKey %>** option in your `export_presets.cfg` file to enable the Gradle build method.
10
+
11
+ ## Do you want to proceed with this change?
12
+
13
+ Please press **Y** to confirm and proceed with the change or **N** to cancel the operation and exit the Android wizard.
@@ -11,26 +11,28 @@ import 'readline-sync';
11
11
  import 'luxon';
12
12
  import 'axios';
13
13
  import 'isomorphic-git';
14
- import './index-Cv-92xRd.js';
14
+ import './baseCommand-CscxrTMI.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-Bg0x6s97.js';
20
+ import { u as useAppleApp } from './useAppleApp-DgZH0CBS.js';
21
21
  import 'fast-glob';
22
22
  import 'yazl';
23
23
  import 'socket.io-client';
24
24
  import 'fullscreen-ink';
25
- import { T as Table } from './Table-FaNgpyeq.js';
26
- import { T as Title } from './Title-BCQtayg6.js';
27
25
  import 'string-length';
28
26
  import 'strip-ansi';
27
+ import { T as Table } from './Table-FaNgpyeq.js';
28
+ import { T as Title } from './Title-BCQtayg6.js';
29
29
  import 'open';
30
+ import './baseGameCommand-BKvHM3h_.js';
31
+ import 'godot-export-presets';
30
32
  import 'marked';
31
33
  import 'marked-terminal';
32
34
  import 'qrcode';
33
- import { u as useAppleBundleId } from './useAppleBundleId-CEOssLqN.js';
35
+ import { u as useAppleBundleId } from './useAppleBundleId-CA7Pg4Hi.js';
34
36
 
35
37
  const AppleAppDetails = (props) => {
36
38
  const { data, isLoading } = useAppleApp(props);
@@ -2,7 +2,7 @@ import { jsx } from 'react/jsx-runtime';
2
2
  import { QueryClientProvider } from '@tanstack/react-query';
3
3
  import { useScreenSize } from 'fullscreen-ink';
4
4
  import { Box } from 'ink';
5
- import { X as queryClient, Y as CommandProvider } from './index-Cv-92xRd.js';
5
+ import { I as queryClient } from './baseCommand-CscxrTMI.js';
6
6
  import 'axios';
7
7
  import 'node:fs';
8
8
  import 'crypto-js';
@@ -19,6 +19,7 @@ import 'react';
19
19
  import 'socket.io-client';
20
20
  import 'fast-glob';
21
21
  import 'yazl';
22
+ import { C as CommandProvider } from './baseGameCommand-BKvHM3h_.js';
22
23
 
23
24
  const Command = ({ children, command }) => {
24
25
  const { width } = useScreenSize();
@@ -1,6 +1,6 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
- import { Z as GameProvider } from './index-Cv-92xRd.js';
3
- import { C as Command } from './Command-C84QiOWP.js';
2
+ import { G as GameProvider } from './baseGameCommand-BKvHM3h_.js';
3
+ import { C as Command } from './Command-cVo97lkQ.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 { R as GameContext, u as getAuthedHeaders, t as API_URL, a0 as cacheKeys } from './index-Cv-92xRd.js';
6
+ import { q as getAuthedHeaders, p as API_URL } from './baseCommand-CscxrTMI.js';
7
7
  import 'ink-spinner';
8
8
  import 'node:crypto';
9
9
  import 'node:fs';
@@ -14,6 +14,7 @@ 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
18
  import 'fast-glob';
18
19
  import 'uuid';
19
20
  import 'yazl';
@@ -27,6 +28,7 @@ import 'marked';
27
28
  import 'marked-terminal';
28
29
  import 'qrcode';
29
30
  import { R as RunWithSpinner } from './RunWithSpinner-DucRnFp6.js';
31
+ import 'godot-export-presets';
30
32
 
31
33
  const CreateKeystore = ({ onComplete, onError, ...boxProps }) => {
32
34
  const { gameId } = useContext(GameContext);
@@ -1,8 +1,9 @@
1
1
  import { jsx, jsxs } from 'react/jsx-runtime';
2
2
  import { Text, Box } from 'ink';
3
3
  import { useState, useEffect, useContext } from 'react';
4
- import { g as getShortUUID, f as getShortDate, P as Platform, O as makeHumanReadable, p as getProject, Q as getProjectPlatformProgress, R as GameContext, S as CommandContext } from './index-Cv-92xRd.js';
4
+ import { c as getShortDate, P as Platform, l as getProject, M as getProjectPlatformProgress } from './baseCommand-CscxrTMI.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
7
  import '@tanstack/react-query';
7
8
  import 'axios';
8
9
  import 'luxon';
@@ -22,6 +23,7 @@ import 'marked';
22
23
  import 'marked-terminal';
23
24
  import { N as NextSteps } from './NextSteps-DbJHmscQ.js';
24
25
  import 'qrcode';
26
+ import 'godot-export-presets';
25
27
 
26
28
  function isPlatformConfigured(platform, progress) {
27
29
  if (!progress) return false;
@@ -11,7 +11,7 @@ import 'readline-sync';
11
11
  import 'luxon';
12
12
  import 'axios';
13
13
  import 'isomorphic-git';
14
- import { X as queryClient, a0 as cacheKeys, P as Platform, C as CredentialsType, R as GameContext } from './index-Cv-92xRd.js';
14
+ import { I as queryClient, P as Platform, C as CredentialsType } from './baseCommand-CscxrTMI.js';
15
15
  import '@oclif/core';
16
16
  import { useMutation } from '@tanstack/react-query';
17
17
  import 'crypto-js';
@@ -24,10 +24,12 @@ 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
28
  import 'marked';
28
29
  import 'marked-terminal';
29
30
  import 'qrcode';
30
- import { i as importCredential } from './import-BYSkF-tX.js';
31
+ import 'godot-export-presets';
32
+ import { i as importCredential } from './import-Bk4w8kks.js';
31
33
 
32
34
  async function importKeystore({ log = () => {
33
35
  }, ...opt }) {
@@ -7,11 +7,8 @@ import { useState, useRef, useEffect } from 'react';
7
7
  import 'node:fs';
8
8
  import 'crypto-js';
9
9
  import 'uuid';
10
- import { a0 as cacheKeys, u as getAuthedHeaders, t as API_URL, V as castArrayObjectDates, M as JobStatus, ay as useJob, az as castJobDates, aw as castObjectDates, N as getStageColor, aA as getMessageColor, aB as getShortTime } from './index-Cv-92xRd.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-CscxrTMI.js';
11
11
  import 'luxon';
12
- import 'fast-glob';
13
- import 'yazl';
14
- import 'socket.io-client';
15
12
  import 'node:crypto';
16
13
  import 'node:path';
17
14
  import 'node:readline';
@@ -19,8 +16,12 @@ import 'node:url';
19
16
  import 'readline-sync';
20
17
  import 'isomorphic-git';
21
18
  import '@oclif/core';
19
+ import 'fast-glob';
20
+ import 'yazl';
21
+ import 'socket.io-client';
22
+ import { k as cacheKeys, y as useJob, h as getStageColor, u as getMessageColor } from './baseGameCommand-BKvHM3h_.js';
22
23
  import 'fullscreen-ink';
23
- import { u as useWebSocket } from './useWebSocket-CWeaaLqi.js';
24
+ import { u as useWebSocket } from './useWebSocket-PU55rRGt.js';
24
25
  import { T as Title } from './Title-BCQtayg6.js';
25
26
  import stringLength from 'string-length';
26
27
  import stripAnsi from 'strip-ansi';
@@ -133,7 +134,18 @@ function useJobWatching({
133
134
  }
134
135
 
135
136
  function getSortedJobLogs(logs) {
136
- return logs.sort((a, b) => a.sentAt.toMillis() - b.sentAt.toMillis());
137
+ return [...logs].sort((a, b) => {
138
+ if (a.sequence != null && b.sequence != null) {
139
+ return a.sequence - b.sequence;
140
+ }
141
+ if (a.sequence != null && b.sequence == null) {
142
+ return -1;
143
+ }
144
+ if (a.sequence == null && b.sequence != null) {
145
+ return 1;
146
+ }
147
+ return a.sentAt.toMillis() - b.sentAt.toMillis();
148
+ });
137
149
  }
138
150
  function useJobLogTail({ isWatching, jobId, length, projectId }) {
139
151
  const [websocketLogs, setWebsocketLogs] = useState([]);
@@ -182,21 +194,23 @@ const TruncatedText = ({ children, wrap, ...textPropsWithoutWrap }) => {
182
194
  return /* @__PURE__ */ jsx(Box, { ref, children: /* @__PURE__ */ jsx(Text, { ...textPropsWithoutWrap, children: getTruncated(children) + "\x1B[0m" }) });
183
195
  };
184
196
 
197
+ const JobLogLine = ({ log, showTimestamp = true, showStage = true }) => {
198
+ const stageColor = getStageColor(log.stage);
199
+ const messageColor = getMessageColor(log.level);
200
+ return /* @__PURE__ */ jsxs(Box, { flexDirection: "row", height: 1, overflow: "hidden", gap: 1, children: [
201
+ showTimestamp && /* @__PURE__ */ jsx(Box, { children: /* @__PURE__ */ jsx(Text, { children: getShortTime(log.sentAt) }) }),
202
+ showStage && /* @__PURE__ */ jsx(Box, { justifyContent: "flex-start", width: 9, children: /* @__PURE__ */ jsx(Text, { color: stageColor, children: log.stage }) }),
203
+ /* @__PURE__ */ jsx(Box, { height: 1, marginRight: 2, overflow: "hidden", children: /* @__PURE__ */ jsx(TruncatedText, { color: messageColor, children: log.message }) })
204
+ ] }, log.id);
205
+ };
206
+
185
207
  const JobLogTail = (props) => {
186
208
  const { data, isLoading } = useJobLogTail(props);
187
209
  return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", children: [
188
210
  /* @__PURE__ */ jsx(Title, { children: "Job Logs" }),
189
211
  isLoading && /* @__PURE__ */ jsx(Spinner, { type: "dots" }),
190
- /* @__PURE__ */ jsx(Box, { flexDirection: "column", children: data.map((log) => {
191
- const stageColor = getStageColor(log.stage);
192
- const messageColor = getMessageColor(log.level);
193
- return /* @__PURE__ */ jsxs(Box, { flexDirection: "row", height: 1, overflow: "hidden", children: [
194
- /* @__PURE__ */ jsx(Box, { children: /* @__PURE__ */ jsx(Text, { children: getShortTime(log.sentAt) }) }),
195
- /* @__PURE__ */ jsx(Box, { justifyContent: "flex-start", marginLeft: 1, width: 9, children: /* @__PURE__ */ jsx(Text, { color: stageColor, children: log.stage }) }),
196
- /* @__PURE__ */ jsx(Box, { height: 1, marginLeft: 1, marginRight: 2, overflow: "hidden", children: /* @__PURE__ */ jsx(TruncatedText, { color: messageColor, children: log.message }) })
197
- ] }, log.id);
198
- }) })
212
+ /* @__PURE__ */ jsx(Box, { flexDirection: "column", children: data.map((log) => /* @__PURE__ */ jsx(JobLogLine, { log }, log.id)) })
199
213
  ] });
200
214
  };
201
215
 
202
- export { JobLogTail as J, useJobWatching as u };
216
+ export { JobLogTail as J, JobLogLine as a, useJobWatching as u };
@@ -4,19 +4,18 @@ import axios from 'axios';
4
4
  import fg from 'fast-glob';
5
5
  import { v4 } from 'uuid';
6
6
  import { ZipFile } from 'yazl';
7
- import { X as queryClient, a0 as cacheKeys, p as getProject, E as DEFAULT_SHIPPED_FILES_GLOBS, F as DEFAULT_IGNORED_FILES_GLOBS, am as getNewUploadTicket, an as getFileHash, ao as startJobsFromUpload, ap as getPlatformName } from './index-Cv-92xRd.js';
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';
8
9
  import { g as getCWDGitInfo } from './git-BpsfNFZ_.js';
9
- import { jsx, Fragment } from 'react/jsx-runtime';
10
- import 'ink';
10
+ import { jsxs, jsx } from 'react/jsx-runtime';
11
+ import { Box, Text } from 'ink';
11
12
  import 'ink-spinner';
12
- import 'react';
13
+ import { useState } from 'react';
13
14
  import 'crypto-js';
14
15
  import 'luxon';
15
16
  import 'socket.io-client';
16
- import { u as useJobWatching } from './JobLogTail-mBXpeWMu.js';
17
+ import { u as useJobWatching, a as JobLogLine } from './JobLogTail-BzisGkY8.js';
17
18
  import 'fullscreen-ink';
18
- import 'string-length';
19
- import 'strip-ansi';
20
19
  import 'open';
21
20
  import '@inkjs/ui';
22
21
  import 'node:path';
@@ -24,6 +23,9 @@ import 'marked';
24
23
  import 'marked-terminal';
25
24
  import { P as ProgressSpinner } from './ProgressSpinner-Um6ARKlk.js';
26
25
  import 'qrcode';
26
+ import 'string-length';
27
+ import 'strip-ansi';
28
+ import 'godot-export-presets';
27
29
 
28
30
  async function ship({ command, log = () => {
29
31
  }, shipFlags }) {
@@ -112,15 +114,25 @@ const useShip = () => useMutation({
112
114
  });
113
115
 
114
116
  const JobProgress = (props) => {
117
+ const [lastWarningLog, setLastWarningLog] = useState(null);
115
118
  const { progress } = useJobWatching({
116
119
  isWatching: true,
117
120
  jobId: props.job.id,
118
121
  onComplete: props.onComplete,
119
122
  onFailure: props.onFailure,
120
- projectId: props.job.project.id
123
+ projectId: props.job.project.id,
124
+ onNewLogEntry: (logEntry) => {
125
+ if (logEntry.level == LogLevel.WARN) setLastWarningLog(logEntry);
126
+ }
121
127
  });
122
128
  const label = `${getPlatformName(props.job.type)} build progress...`;
123
- return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx(ProgressSpinner, { label, progress, spinnerType: "dots" }) });
129
+ return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", gap: 0, children: [
130
+ /* @__PURE__ */ jsx(ProgressSpinner, { label, progress, spinnerType: "dots" }),
131
+ lastWarningLog && /* @__PURE__ */ jsxs(Box, { flexDirection: "row", gap: 1, marginLeft: 2, children: [
132
+ /* @__PURE__ */ jsx(Text, { color: getMessageColor(lastWarningLog.level), children: "WARNING" }),
133
+ /* @__PURE__ */ jsx(JobLogLine, { log: lastWarningLog, showTimestamp: false, showStage: false })
134
+ ] })
135
+ ] });
124
136
  };
125
137
 
126
138
  export { JobProgress as J, useShip as u };
@@ -3,16 +3,17 @@ 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 { M as JobStatus, J as getJobSummary, N as getStageColor, K as getJobStatusColor } from './index-Cv-92xRd.js';
6
+ import { J as JobStatus } from './baseCommand-CscxrTMI.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
13
  import 'fast-glob';
13
14
  import 'yazl';
14
15
  import 'socket.io-client';
15
- import { u as useJobWatching } from './JobLogTail-mBXpeWMu.js';
16
+ import { u as useJobWatching } from './JobLogTail-BzisGkY8.js';
16
17
  import 'fullscreen-ink';
17
18
  import { a as StatusRow, b as StatusRowLabel } from './StatusTable-DzRWcMr4.js';
18
19
  import { T as Title } from './Title-BCQtayg6.js';
@@ -10,13 +10,13 @@ import 'readline-sync';
10
10
  import 'luxon';
11
11
  import 'axios';
12
12
  import 'isomorphic-git';
13
- import './index-Cv-92xRd.js';
13
+ import './baseCommand-CscxrTMI.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-CsQWPdyo.js';
19
+ import { u as useProjectCredentials, g as getProjectCredentialSummary } from './useProjectCredentials-rQLm2O1J.js';
20
20
  import 'fast-glob';
21
21
  import 'yazl';
22
22
  import 'socket.io-client';
@@ -10,7 +10,7 @@ import 'readline-sync';
10
10
  import 'luxon';
11
11
  import axios from 'axios';
12
12
  import 'isomorphic-git';
13
- import { a0 as cacheKeys, g as getShortUUID, f as getShortDate, u as getAuthedHeaders, t as API_URL, V as castArrayObjectDates } from './index-Cv-92xRd.js';
13
+ import { c as getShortDate, q as getAuthedHeaders, p as API_URL, H as castArrayObjectDates } from './baseCommand-CscxrTMI.js';
14
14
  import '@oclif/core';
15
15
  import { useQuery } from '@tanstack/react-query';
16
16
  import 'react';
@@ -18,6 +18,7 @@ import 'crypto-js';
18
18
  import 'uuid';
19
19
  import 'fast-glob';
20
20
  import 'yazl';
21
+ import { k as cacheKeys, g as getShortUUID } from './baseGameCommand-BKvHM3h_.js';
21
22
  import 'socket.io-client';
22
23
  import 'fullscreen-ink';
23
24
  import { T as Table } from './Table-FaNgpyeq.js';
@@ -1,4 +1,4 @@
1
- import { B as BaseAuthenticatedCommand } from './index-Cv-92xRd.js';
1
+ import { B as BaseAuthenticatedCommand } from './baseGameCommand-BKvHM3h_.js';
2
2
 
3
3
  class BaseAppleCommand extends BaseAuthenticatedCommand {
4
4
  async init() {