shipthis 0.1.44 → 0.1.45

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 (90) hide show
  1. package/README.md +6 -45
  2. package/dist/{AppleBundleIdDetails-DSTNVuCE.js → AppleBundleIdDetails-Cx8k-rYB.js} +4 -4
  3. package/dist/{Command-CUAYljjP.js → Command-B2Qnw47r.js} +2 -2
  4. package/dist/{CommandGame-DpCdhjIa.js → CommandGame-C23_F55i.js} +2 -2
  5. package/dist/{Create-CrvCt5uP.js → Create-BxNeKc2r.js} +2 -2
  6. package/dist/{GameStatus-4GPzUgCD.js → GameStatus-repzSNId.js} +2 -2
  7. package/dist/{Import-BXH6fSxe.js → Import-D6J9b-XO.js} +3 -3
  8. package/dist/{JobLogTail-CNw7TQdK.js → JobLogTail-CJWxpIq5.js} +3 -3
  9. package/dist/{JobProgress-BbklmvdG.js → JobProgress-CISmKMuD.js} +3 -3
  10. package/dist/{JobStatusTable-L4wAk8Ns.js → JobStatusTable-BEOu5MgG.js} +3 -3
  11. package/dist/{ProjectCredentialsTable-BfMmJ7AU.js → ProjectCredentialsTable-DR11Mn7W.js} +2 -2
  12. package/dist/{UserCredentialsTable-081xdlb9.js → UserCredentialsTable-db4Xb8HC.js} +2 -2
  13. package/dist/{baseAppleCommand-DDQU5PTs.js → baseAppleCommand-YzhCAdUY.js} +1 -1
  14. package/dist/{baseCommand-CdsX3LS8.js → baseCommand-ClUdS6Cn.js} +120 -8
  15. package/dist/{baseGameAndroidCommand-CAQVvU3i.js → baseGameAndroidCommand-LdDRof_I.js} +2 -2
  16. package/dist/{baseGameCommand-CCyAhN-V.js → baseGameCommand-DQ6Wj-Pk.js} +43 -43
  17. package/dist/commands/apiKey/create.js +3 -3
  18. package/dist/commands/apiKey/list.js +3 -3
  19. package/dist/commands/apiKey/revoke.js +3 -3
  20. package/dist/commands/apple/apiKey/create.js +6 -6
  21. package/dist/commands/apple/apiKey/delete.js +4 -4
  22. package/dist/commands/apple/apiKey/export.js +5 -5
  23. package/dist/commands/apple/apiKey/import.js +5 -5
  24. package/dist/commands/apple/apiKey/status.js +4 -4
  25. package/dist/commands/apple/certificate/create.js +6 -6
  26. package/dist/commands/apple/certificate/delete.js +4 -4
  27. package/dist/commands/apple/certificate/export.js +5 -5
  28. package/dist/commands/apple/certificate/import.js +5 -5
  29. package/dist/commands/apple/certificate/status.js +4 -4
  30. package/dist/commands/apple/login.js +2 -2
  31. package/dist/commands/apple/status.js +3 -3
  32. package/dist/commands/dashboard.js +2 -2
  33. package/dist/commands/game/android/apiKey/connect.js +8 -8
  34. package/dist/commands/game/android/apiKey/create.js +10 -10
  35. package/dist/commands/game/android/apiKey/delete.js +4 -4
  36. package/dist/commands/game/android/apiKey/export.js +6 -6
  37. package/dist/commands/game/android/apiKey/import.js +6 -6
  38. package/dist/commands/game/android/apiKey/invite.js +3 -3
  39. package/dist/commands/game/android/apiKey/policy.js +3 -3
  40. package/dist/commands/game/android/apiKey/status.js +6 -6
  41. package/dist/commands/game/android/keyStore/create.js +7 -7
  42. package/dist/commands/game/android/keyStore/delete.js +4 -4
  43. package/dist/commands/game/android/keyStore/export.js +5 -5
  44. package/dist/commands/game/android/keyStore/import.js +8 -8
  45. package/dist/commands/game/android/keyStore/status.js +5 -5
  46. package/dist/commands/game/android/status.js +2 -2
  47. package/dist/commands/game/build/download.js +3 -3
  48. package/dist/commands/game/build/list.js +4 -4
  49. package/dist/commands/game/create.js +2 -2
  50. package/dist/commands/game/details.js +3 -3
  51. package/dist/commands/game/export.js +2 -2
  52. package/dist/commands/game/ios/app/addTester.js +4 -4
  53. package/dist/commands/game/ios/app/create.js +3 -3
  54. package/dist/commands/game/ios/app/status.js +6 -6
  55. package/dist/commands/game/ios/app/sync.js +4 -4
  56. package/dist/commands/game/ios/profile/create.js +9 -7
  57. package/dist/commands/game/ios/profile/delete.js +4 -4
  58. package/dist/commands/game/ios/profile/export.js +5 -5
  59. package/dist/commands/game/ios/profile/import.js +5 -5
  60. package/dist/commands/game/ios/profile/status.js +6 -6
  61. package/dist/commands/game/ios/status.js +8 -8
  62. package/dist/commands/game/ios/wizard.js +3 -3
  63. package/dist/commands/game/job/list.js +3 -3
  64. package/dist/commands/game/job/status.js +6 -6
  65. package/dist/commands/game/list.js +3 -3
  66. package/dist/commands/game/ship.js +8 -8
  67. package/dist/commands/game/status.js +5 -5
  68. package/dist/commands/game/wizard.js +15 -15
  69. package/dist/commands/internal/fastlane.js +2 -2
  70. package/dist/commands/internal/readme.js +2 -2
  71. package/dist/commands/login.js +2 -2
  72. package/dist/commands/status.js +3 -3
  73. package/dist/commands/util/android-build-method.js +2 -2
  74. package/dist/commands/util/glass.js +1 -1
  75. package/dist/{export-4rGFZrzT.js → export-Dq53OG06.js} +1 -1
  76. package/dist/{import-C9i4RAW6.js → import-CPAFgZO5.js} +1 -1
  77. package/dist/{index-B-7dXz3a.js → index-B-5yl-9h.js} +5 -5
  78. package/dist/{index-DBy7ImFs.js → index-BMdQLpAh.js} +1 -1
  79. package/dist/{index-CQKTbsum.js → index-ZQyiwS8O.js} +4 -4
  80. package/dist/{upload-DWm3upu4.js → upload-BfWRd6ss.js} +1 -1
  81. package/dist/{useAppleApp-B0I5eZYx.js → useAppleApp-BZ1YvB2M.js} +1 -1
  82. package/dist/{useAppleBundleId-D4Uk-B7k.js → useAppleBundleId-CVBg5V7b.js} +1 -1
  83. package/dist/{useAppleProfiles-YAcyvQa0.js → useAppleProfiles-BPZwJoCh.js} +1 -1
  84. package/dist/{useGoogleStatus-CMZyzdD6.js → useGoogleStatus-TpGFvpk5.js} +2 -2
  85. package/dist/{useProjectCredentials-8rTRb2Y7.js → useProjectCredentials-Dv0DF2rA.js} +2 -2
  86. package/dist/{useWebSocket-CFc1M_mq.js → useWebSocket-Bj5fQveo.js} +1 -1
  87. package/docs/game/ios/app.md +11 -14
  88. package/npm-shrinkwrap.json +4358 -1535
  89. package/oclif.manifest.json +1 -1
  90. package/package.json +13 -10
package/README.md CHANGED
@@ -49,7 +49,7 @@ 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).
52
+ Read more about [how ShipThis exports Godot Android games](https://shipth.is/docs/guides/android-export-methods?ref=github_readme) (Gradle vs legacy, APK/AAB output).
53
53
 
54
54
  ```bash
55
55
  shipthis game wizard android
@@ -109,7 +109,7 @@ We support **all stable Godot versions since 3.6**, including:
109
109
 
110
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
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) | |
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) | [4.6.1](https://github.com/godotengine/godot/releases/tag/4.6.1-stable) |
113
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
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
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) | | | | | |
@@ -368,49 +368,9 @@ We store:
368
368
 
369
369
  ### What happens to my files when I run the command `shipthis game ship`?
370
370
 
371
- #### 1. Uploading your game files
371
+ Your game files are packaged, uploaded to private storage via a temporary signed URL, and made available to an ephemeral build machine. After the build completes, all files are cleaned up on the machine. Uploaded files and build outputs are retained for **30 days** before automatic deletion.
372
372
 
373
- When you run the command, the CLI asks the ShipThis backend for a secure (HTTPS) temporary upload URL.
374
- Your game files are packaged locally on your machine:
375
-
376
- - Files matching `shippedFilesGlobs` in `shipthis.json` are included
377
- - Files matching `ignoredFilesGlobs` are excluded
378
-
379
- The zip file is then uploaded directly from your computer to a private DigitalOcean Space using the temporary upload URL.
380
-
381
- #### 2. Where the files are stored
382
-
383
- The uploaded zip lives in a private DigitalOcean Space. The space is not public and cannot be browsed.
384
-
385
- 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.
386
-
387
- This storage is used for:
388
-
389
- - Providing a build machine access to your game files
390
- - Storing the resulting build outputs (APK/AAB/IPA)
391
-
392
- #### 3. How build machines access your code
393
-
394
- Build machines do not have general access to storage of game files or credentials.
395
-
396
- 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.
397
-
398
- Build machines cannot browse files or access anything outside the job that they are currently running.
399
-
400
- #### 4. Cleanup after the build
401
-
402
- After a build machine has completed a job, a cleanup routine is run which deletes:
403
-
404
- - Downloaded and extracted game files
405
- - Build intermediates
406
- - Temporary files
407
-
408
- The build machines do not keep user files after a job completes.
409
-
410
- #### 5. Retention and deletion
411
-
412
- - Uploaded game file zips and build outputs (APK/AAB/IPA) are retained for **30 days**
413
- - A lifecycle policy set on the storage automatically deletes them after that period
373
+ Read the full [How your code is handled](https://shipth.is/docs/guides/code-handling?ref=github_readme) guide for details.
414
374
 
415
375
  ## 📖 Command Reference
416
376
 
@@ -432,8 +392,9 @@ The build machines do not keep user files after a job completes.
432
392
  ### 📚 Guides
433
393
 
434
394
  - [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
395
+ - [Android export methods](https://shipth.is/docs/guides/android-export-methods?ref=github_readme) - Gradle vs legacy builds, APK & AAB output
436
396
  - [Godot versioning](https://shipth.is/docs/guides/godot-versioning?ref=github_readme) - Supported Godot versions and custom builds
397
+ - [How your code is handled](https://shipth.is/docs/guides/code-handling?ref=github_readme) - Upload, storage, and 30-day retention policy
437
398
  - [Liquid Glass icons](https://shipth.is/docs/guides/liquid-glass?ref=github_readme) - Use Liquid Glass icons with your iOS game
438
399
  - [Troubleshooting](https://shipth.is/docs/troubleshooting?ref=github_readme) - Common issues and how to fix them
439
400
 
@@ -11,11 +11,11 @@ import 'readline-sync';
11
11
  import 'luxon';
12
12
  import 'axios';
13
13
  import 'isomorphic-git';
14
- import './baseCommand-CdsX3LS8.js';
14
+ import './baseCommand-ClUdS6Cn.js';
15
15
  import '@oclif/core';
16
16
  import '@tanstack/react-query';
17
17
  import 'react';
18
- import { u as useAppleApp } from './useAppleApp-B0I5eZYx.js';
18
+ import { u as useAppleApp } from './useAppleApp-BZ1YvB2M.js';
19
19
  import 'fast-glob';
20
20
  import 'uuid';
21
21
  import 'socket.io-client';
@@ -27,12 +27,12 @@ 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-CCyAhN-V.js';
30
+ import './baseGameCommand-DQ6Wj-Pk.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-D4Uk-B7k.js';
35
+ import { u as useAppleBundleId } from './useAppleBundleId-CVBg5V7b.js';
36
36
 
37
37
  const AppleAppDetails = (props) => {
38
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 { I as queryClient } from './baseCommand-CdsX3LS8.js';
5
+ import { I as queryClient } from './baseCommand-ClUdS6Cn.js';
6
6
  import 'axios';
7
7
  import 'node:fs';
8
8
  import 'luxon';
@@ -19,7 +19,7 @@ import 'stream';
19
19
  import 'yazl';
20
20
  import 'fast-glob';
21
21
  import 'uuid';
22
- import { C as CommandProvider } from './baseGameCommand-CCyAhN-V.js';
22
+ import { C as CommandProvider } from './baseGameCommand-DQ6Wj-Pk.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-CCyAhN-V.js';
3
- import { C as Command } from './Command-CUAYljjP.js';
2
+ import { G as GameProvider } from './baseGameCommand-DQ6Wj-Pk.js';
3
+ import { C as Command } from './Command-B2Qnw47r.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-CdsX3LS8.js';
6
+ import { q as getAuthedHeaders, p as API_URL } from './baseCommand-ClUdS6Cn.js';
7
7
  import 'ink-spinner';
8
8
  import 'node:crypto';
9
9
  import 'node:fs';
@@ -14,7 +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-CCyAhN-V.js';
17
+ import { i as GameContext, k as cacheKeys } from './baseGameCommand-DQ6Wj-Pk.js';
18
18
  import 'fast-glob';
19
19
  import 'uuid';
20
20
  import 'socket.io-client';
@@ -1,9 +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 { c as getShortDate, P as Platform, l as getProject, M as getProjectPlatformProgress } from './baseCommand-CdsX3LS8.js';
4
+ import { c as getShortDate, P as Platform, l as getProject, M as getProjectPlatformProgress } from './baseCommand-ClUdS6Cn.js';
5
5
  import 'ink-spinner';
6
- import { g as getShortUUID, m as makeHumanReadable, i as GameContext, j as CommandContext } from './baseGameCommand-CCyAhN-V.js';
6
+ import { g as getShortUUID, m as makeHumanReadable, i as GameContext, j as CommandContext } from './baseGameCommand-DQ6Wj-Pk.js';
7
7
  import '@tanstack/react-query';
8
8
  import 'axios';
9
9
  import 'luxon';
@@ -11,7 +11,7 @@ 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-CdsX3LS8.js';
14
+ import { I as queryClient, P as Platform, C as CredentialsType } from './baseCommand-ClUdS6Cn.js';
15
15
  import '@oclif/core';
16
16
  import { useMutation } from '@tanstack/react-query';
17
17
  import 'fast-glob';
@@ -24,12 +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-CCyAhN-V.js';
27
+ import { k as cacheKeys, i as GameContext } from './baseGameCommand-DQ6Wj-Pk.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-C9i4RAW6.js';
32
+ import { i as importCredential } from './import-CPAFgZO5.js';
33
33
 
34
34
  async function importKeystore({ log = () => {
35
35
  }, ...opt }) {
@@ -5,7 +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 { 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';
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-ClUdS6Cn.js';
9
9
  import 'luxon';
10
10
  import 'node:crypto';
11
11
  import 'node:path';
@@ -19,9 +19,9 @@ import 'yazl';
19
19
  import 'fast-glob';
20
20
  import 'uuid';
21
21
  import 'socket.io-client';
22
- import { k as cacheKeys, y as useJob, h as getStageColor, x as getMessageColor } from './baseGameCommand-CCyAhN-V.js';
22
+ import { k as cacheKeys, y as useJob, h as getStageColor, x as getMessageColor } from './baseGameCommand-DQ6Wj-Pk.js';
23
23
  import 'fullscreen-ink';
24
- import { u as useWebSocket } from './useWebSocket-CFc1M_mq.js';
24
+ import { u as useWebSocket } from './useWebSocket-Bj5fQveo.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';
@@ -2,8 +2,8 @@ import fs__default from 'node:fs';
2
2
  import { useMutation } from '@tanstack/react-query';
3
3
  import fg from 'fast-glob';
4
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';
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-ClUdS6Cn.js';
6
+ import { k as cacheKeys, v as getFileHash, w as getPlatformName, x as getMessageColor } from './baseGameCommand-DQ6Wj-Pk.js';
7
7
  import { ZipFile } from 'yazl';
8
8
  import { g as getCWDGitInfo } from './git-BpsfNFZ_.js';
9
9
  import { Readable, Transform } from 'stream';
@@ -14,7 +14,7 @@ import { useState } from 'react';
14
14
  import 'axios';
15
15
  import 'luxon';
16
16
  import 'socket.io-client';
17
- import { u as useJobWatching, a as JobLogLine } from './JobLogTail-CNw7TQdK.js';
17
+ import { u as useJobWatching, a as JobLogLine } from './JobLogTail-CJWxpIq5.js';
18
18
  import 'fullscreen-ink';
19
19
  import 'open';
20
20
  import '@inkjs/ui';
@@ -3,15 +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-CdsX3LS8.js';
6
+ import { J as JobStatus } from './baseCommand-ClUdS6Cn.js';
7
7
  import '@tanstack/react-query';
8
8
  import 'axios';
9
9
  import 'node:fs';
10
- import { e as getJobSummary, h as getStageColor, f as getJobStatusColor } from './baseGameCommand-CCyAhN-V.js';
10
+ import { e as getJobSummary, h as getStageColor, f as getJobStatusColor } from './baseGameCommand-DQ6Wj-Pk.js';
11
11
  import 'fast-glob';
12
12
  import 'uuid';
13
13
  import 'socket.io-client';
14
- import { u as useJobWatching } from './JobLogTail-CNw7TQdK.js';
14
+ import { u as useJobWatching } from './JobLogTail-CJWxpIq5.js';
15
15
  import 'fullscreen-ink';
16
16
  import { a as StatusRow, b as StatusRowLabel } from './StatusTable-DzRWcMr4.js';
17
17
  import { T as Title } from './Title-BCQtayg6.js';
@@ -10,11 +10,11 @@ import 'readline-sync';
10
10
  import 'luxon';
11
11
  import 'axios';
12
12
  import 'isomorphic-git';
13
- import './baseCommand-CdsX3LS8.js';
13
+ import './baseCommand-ClUdS6Cn.js';
14
14
  import '@oclif/core';
15
15
  import '@tanstack/react-query';
16
16
  import 'react';
17
- import { u as useProjectCredentials, g as getProjectCredentialSummary } from './useProjectCredentials-8rTRb2Y7.js';
17
+ import { u as useProjectCredentials, g as getProjectCredentialSummary } from './useProjectCredentials-Dv0DF2rA.js';
18
18
  import 'fast-glob';
19
19
  import 'uuid';
20
20
  import 'socket.io-client';
@@ -10,13 +10,13 @@ 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-CdsX3LS8.js';
13
+ import { c as getShortDate, q as getAuthedHeaders, p as API_URL, H as castArrayObjectDates } from './baseCommand-ClUdS6Cn.js';
14
14
  import '@oclif/core';
15
15
  import { useQuery } from '@tanstack/react-query';
16
16
  import 'react';
17
17
  import 'fast-glob';
18
18
  import 'uuid';
19
- import { k as cacheKeys, g as getShortUUID } from './baseGameCommand-CCyAhN-V.js';
19
+ import { k as cacheKeys, g as getShortUUID } from './baseGameCommand-DQ6Wj-Pk.js';
20
20
  import 'socket.io-client';
21
21
  import 'fullscreen-ink';
22
22
  import 'stream';
@@ -1,4 +1,4 @@
1
- import { B as BaseAuthenticatedCommand } from './baseGameCommand-CCyAhN-V.js';
1
+ import { B as BaseAuthenticatedCommand } from './baseGameCommand-DQ6Wj-Pk.js';
2
2
 
3
3
  class BaseAppleCommand extends BaseAuthenticatedCommand {
4
4
  async init() {
@@ -422,23 +422,135 @@ var BuildType = /* @__PURE__ */ ((BuildType2) => {
422
422
  return BuildType2;
423
423
  })(BuildType || {});
424
424
 
425
+ const ENTITLEMENT_KEY_TO_CAPABILITY = {
426
+ "com.apple.developer.applesignin": { name: "Sign in with Apple", type: CapabilityType.APPLE_ID_AUTH },
427
+ "com.apple.developer.game-center": { name: "Game Center", type: CapabilityType.GAME_CENTER },
428
+ "com.apple.developer.healthkit": { name: "HealthKit", type: CapabilityType.HEALTH_KIT },
429
+ "com.apple.developer.healthkit.recalibrate-estimates": {
430
+ name: "HealthKit Recalibrate Estimates",
431
+ type: CapabilityType.HEALTH_KIT_RECALIBRATE_ESTIMATES
432
+ },
433
+ "com.apple.developer.homekit": { name: "HomeKit", type: CapabilityType.HOME_KIT },
434
+ "com.apple.developer.associated-domains": {
435
+ name: "Associated Domains",
436
+ type: CapabilityType.ASSOCIATED_DOMAINS
437
+ },
438
+ "com.apple.developer.authentication-services.autofill-credential-provider": {
439
+ name: "AutoFill Credential Provider",
440
+ type: CapabilityType.AUTO_FILL_CREDENTIAL
441
+ },
442
+ "com.apple.developer.ClassKit-environment": { name: "ClassKit", type: CapabilityType.CLASS_KIT },
443
+ "com.apple.developer.family-controls": {
444
+ name: "Family Controls",
445
+ type: CapabilityType.FAMILY_CONTROLS
446
+ },
447
+ "com.apple.developer.group-session": {
448
+ name: "Group Activities",
449
+ type: CapabilityType.GROUP_ACTIVITIES
450
+ },
451
+ "com.apple.developer.fileprovider.testing-mode": {
452
+ name: "File Provider Testing Mode",
453
+ type: CapabilityType.FILE_PROVIDER_TESTING_MODE
454
+ },
455
+ "com.apple.developer.networking.networkextension": {
456
+ name: "Network Extensions",
457
+ type: CapabilityType.NETWORK_EXTENSIONS
458
+ },
459
+ "com.apple.developer.networking.vpn.api": {
460
+ name: "Personal VPN",
461
+ type: CapabilityType.PERSONAL_VPN
462
+ },
463
+ "com.apple.developer.in-app-payments": { name: "Apple Pay", type: CapabilityType.APPLE_PAY },
464
+ "com.apple.developer.kernel.extended-virtual-addressing": {
465
+ name: "Extended Virtual Addressing",
466
+ type: CapabilityType.EXTENDED_VIRTUAL_ADDRESSING
467
+ },
468
+ "com.apple.developer.journal.allow": {
469
+ name: "Journaling Suggestions",
470
+ type: CapabilityType.JOURNALING_SUGGESTIONS
471
+ },
472
+ "com.apple.developer.managed-app-distribution.install-ui": {
473
+ name: "Managed App Installation UI",
474
+ type: CapabilityType.MANAGED_APP_INSTALLATION_UI
475
+ },
476
+ "com.apple.developer.media-device-discovery-extension": {
477
+ name: "Media Device Discovery",
478
+ type: CapabilityType.MEDIA_DEVICE_DISCOVERY
479
+ },
480
+ "com.apple.developer.matter.allow-setup-payload": {
481
+ name: "Matter Allow Setup Payload",
482
+ type: CapabilityType.MATTER_ALLOW_SETUP_PAYLOAD
483
+ },
484
+ "com.apple.developer.sustained-execution": {
485
+ name: "Sustained Execution",
486
+ type: CapabilityType.SUSTAINED_EXECUTION
487
+ },
488
+ "com.apple.security.application-groups": { name: "App Groups", type: CapabilityType.APP_GROUP }
489
+ };
490
+ const KEY_ELEMENT_REGEX = /<key>\s*([^<]+?)\s*<\/key>/g;
491
+ function parseEntitlementsAdditional(raw) {
492
+ const types = [];
493
+ if (!raw || typeof raw !== "string") return types;
494
+ let match;
495
+ KEY_ELEMENT_REGEX.lastIndex = 0;
496
+ while ((match = KEY_ELEMENT_REGEX.exec(raw)) !== null) {
497
+ const key = match[1].trim();
498
+ const entry = ENTITLEMENT_KEY_TO_CAPABILITY[key];
499
+ if (entry && !types.includes(entry.type)) types.push(entry.type);
500
+ }
501
+ return types;
502
+ }
503
+
425
504
  function isCWDGodotGame() {
426
505
  const cwd = process.cwd();
427
506
  const godotProject = path__default.join(cwd, "project.godot");
428
507
  return fs__default.existsSync(godotProject);
429
508
  }
430
- const GODOT_CAPABILITIES = [
431
- // TODO: how about capabilities from godot extensions
509
+ const GODOT_SYNCABLE_CAPABILITIES = [
432
510
  { key: "capabilities/access_wifi", name: "Access WiFi", type: CapabilityType.ACCESS_WIFI },
433
- { key: "capabilities/push_notifications", name: "Push Notifications", type: CapabilityType.PUSH_NOTIFICATIONS }
511
+ { key: "entitlements/increased_memory_limit", name: "Increased Memory Limit", type: CapabilityType.INCREASED_MEMORY_LIMIT },
512
+ { key: "entitlements/game_center", name: "Game Center", type: CapabilityType.GAME_CENTER },
513
+ { key: "entitlements/push_notifications", name: "Push Notifications", type: CapabilityType.PUSH_NOTIFICATIONS, pushKey: true }
514
+ ];
515
+ const syncableTypes = new Set(GODOT_SYNCABLE_CAPABILITIES.map((c) => c.type));
516
+ const GODOT_CAPABILITIES = [
517
+ ...GODOT_SYNCABLE_CAPABILITIES,
518
+ ...Object.entries(ENTITLEMENT_KEY_TO_CAPABILITY).filter(([, { type }]) => !syncableTypes.has(type)).map(([key, { name, type }]) => ({
519
+ key: `entitlements/additional (${key})`,
520
+ name,
521
+ type
522
+ }))
434
523
  ];
435
- async function getGodotProjectCapabilities(platform) {
436
- const exportPresets = await getGodotExportPresets(platform);
437
- const options = exportPresets.options || {};
524
+ function isPushEnabled(options) {
525
+ const entitlementsPush = options["entitlements/push_notifications"];
526
+ if (entitlementsPush != null) {
527
+ const s = `${entitlementsPush}`.trim().toLowerCase();
528
+ if (s === "production" || s === "development") return true;
529
+ if (s === "disabled") return false;
530
+ }
531
+ const legacyPush = options["capabilities/push_notifications"];
532
+ if (legacyPush != null) {
533
+ return `${legacyPush}`.toLowerCase() === "true";
534
+ }
535
+ return false;
536
+ }
537
+ async function getGodotProjectCapabilities(platform, overrides) {
538
+ const options = (await getGodotExportPresets(platform)).options ?? {};
438
539
  const capabilities = [];
439
- for (const capability of GODOT_CAPABILITIES) {
540
+ for (const capability of GODOT_SYNCABLE_CAPABILITIES) {
541
+ if (capability.pushKey) {
542
+ if (isPushEnabled(options)) capabilities.push(capability.type);
543
+ continue;
544
+ }
440
545
  if (!(capability.key in options)) continue;
441
- if (`${options[capability.key]}`.toLocaleLowerCase() === "true") capabilities.push(capability.type);
546
+ if (`${options[capability.key]}`.toLowerCase() === "true") capabilities.push(capability.type);
547
+ }
548
+ const additionalRaw = options["entitlements/additional"];
549
+ const fromAdditional = parseEntitlementsAdditional(
550
+ typeof additionalRaw === "string" ? additionalRaw : ""
551
+ );
552
+ for (const type of fromAdditional) {
553
+ if (!capabilities.includes(type)) capabilities.push(type);
442
554
  }
443
555
  return capabilities;
444
556
  }
@@ -1,5 +1,5 @@
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';
1
+ import { O as getGoogleStatus, Q as getGodotAndroidPackageName } from './baseCommand-ClUdS6Cn.js';
2
+ import { c as BaseGameCommand, d as generatePackageName, b as getInput } from './baseGameCommand-DQ6Wj-Pk.js';
3
3
 
4
4
  class BaseGameAndroidCommand extends BaseGameCommand {
5
5
  async checkGoogleAuth(waitForAuth = false) {