shipthis 0.1.44 → 0.1.46

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 (92) hide show
  1. package/README.md +6 -45
  2. package/dist/{AppleBundleIdDetails-DSTNVuCE.js → AppleBundleIdDetails-DogjUozj.js} +4 -4
  3. package/dist/{Command-CUAYljjP.js → Command-CWKSGrtu.js} +2 -2
  4. package/dist/{CommandGame-DpCdhjIa.js → CommandGame-B7EQbgMq.js} +2 -2
  5. package/dist/{Create-CrvCt5uP.js → Create-DVnctE1E.js} +2 -2
  6. package/dist/{GameStatus-4GPzUgCD.js → GameStatus-DbwQmv4w.js} +2 -2
  7. package/dist/{Import-BXH6fSxe.js → Import-OqdHUTRB.js} +3 -3
  8. package/dist/{JobLogTail-CNw7TQdK.js → JobLogTail-D-IhoJDu.js} +4 -4
  9. package/dist/{JobProgress-BbklmvdG.js → JobProgress-C24YiJOA.js} +4 -4
  10. package/dist/{JobStatusTable-L4wAk8Ns.js → JobStatusTable-BrfiBJ2p.js} +3 -3
  11. package/dist/{ProjectCredentialsTable-BfMmJ7AU.js → ProjectCredentialsTable-DyUiZFwz.js} +2 -2
  12. package/dist/{UserCredentialsTable-081xdlb9.js → UserCredentialsTable-DBasvwqB.js} +2 -2
  13. package/dist/{baseAppleCommand-DDQU5PTs.js → baseAppleCommand-Dfzhp492.js} +1 -1
  14. package/dist/{baseCommand-CdsX3LS8.js → baseCommand-B7pUDBYl.js} +123 -11
  15. package/dist/{baseGameAndroidCommand-CAQVvU3i.js → baseGameAndroidCommand-BhridFzb.js} +2 -2
  16. package/dist/{baseGameCommand-CCyAhN-V.js → baseGameCommand-BTC5XD8W.js} +47 -47
  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 +9 -9
  21. package/dist/commands/apple/apiKey/delete.js +6 -6
  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 +9 -9
  26. package/dist/commands/apple/certificate/delete.js +6 -6
  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 +4 -4
  32. package/dist/commands/dashboard.js +3 -3
  33. package/dist/commands/game/android/apiKey/connect.js +11 -11
  34. package/dist/commands/game/android/apiKey/create.js +13 -13
  35. package/dist/commands/game/android/apiKey/delete.js +6 -6
  36. package/dist/commands/game/android/apiKey/export.js +9 -9
  37. package/dist/commands/game/android/apiKey/import.js +9 -9
  38. package/dist/commands/game/android/apiKey/invite.js +6 -6
  39. package/dist/commands/game/android/apiKey/policy.js +8 -8
  40. package/dist/commands/game/android/apiKey/status.js +9 -9
  41. package/dist/commands/game/android/keyStore/create.js +10 -10
  42. package/dist/commands/game/android/keyStore/delete.js +6 -6
  43. package/dist/commands/game/android/keyStore/export.js +8 -8
  44. package/dist/commands/game/android/keyStore/import.js +11 -11
  45. package/dist/commands/game/android/keyStore/status.js +9 -9
  46. package/dist/commands/game/android/status.js +7 -7
  47. package/dist/commands/game/build/download.js +6 -6
  48. package/dist/commands/game/build/list.js +7 -7
  49. package/dist/commands/game/create.js +2 -2
  50. package/dist/commands/game/details.js +5 -5
  51. package/dist/commands/game/export.js +2 -2
  52. package/dist/commands/game/ios/app/addTester.js +6 -6
  53. package/dist/commands/game/ios/app/create.js +5 -5
  54. package/dist/commands/game/ios/app/status.js +9 -9
  55. package/dist/commands/game/ios/app/sync.js +7 -7
  56. package/dist/commands/game/ios/profile/create.js +12 -10
  57. package/dist/commands/game/ios/profile/delete.js +7 -7
  58. package/dist/commands/game/ios/profile/export.js +8 -8
  59. package/dist/commands/game/ios/profile/import.js +8 -8
  60. package/dist/commands/game/ios/profile/status.js +9 -9
  61. package/dist/commands/game/ios/status.js +11 -11
  62. package/dist/commands/game/ios/wizard.js +3 -3
  63. package/dist/commands/game/job/list.js +6 -6
  64. package/dist/commands/game/job/status.js +9 -9
  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 +34 -34
  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 +4 -4
  73. package/dist/commands/util/android-build-method.js +2 -2
  74. package/dist/commands/util/glass.js +2 -2
  75. package/dist/{export-4rGFZrzT.js → export-7GgsEM8k.js} +1 -1
  76. package/dist/{import-C9i4RAW6.js → import-DKibfocC.js} +1 -1
  77. package/dist/{index-B-7dXz3a.js → index-3FFnBAwx.js} +5 -5
  78. package/dist/{index-DBy7ImFs.js → index-B_dXK-Zt.js} +1 -1
  79. package/dist/{index-CQKTbsum.js → index-BeGDjWvi.js} +5 -4
  80. package/dist/index.js +0 -0
  81. package/dist/{upload-DWm3upu4.js → upload-DGY-glMy.js} +1 -1
  82. package/dist/{useAppleApp-B0I5eZYx.js → useAppleApp-DRJf8q6R.js} +1 -1
  83. package/dist/{useAppleBundleId-D4Uk-B7k.js → useAppleBundleId-B-5a-soi.js} +1 -1
  84. package/dist/{useAppleProfiles-YAcyvQa0.js → useAppleProfiles-BXXI2MAc.js} +1 -1
  85. package/dist/{useGoogleStatus-CMZyzdD6.js → useGoogleStatus-CETX9Rbw.js} +2 -2
  86. package/dist/{useProjectCredentials-8rTRb2Y7.js → useProjectCredentials-AV_OlZEu.js} +2 -2
  87. package/dist/{useWebSocket-CFc1M_mq.js → useWebSocket-DgYLiSrd.js} +1 -1
  88. package/dist/utils/help.js +0 -0
  89. package/docs/game/ios/app.md +11 -14
  90. package/npm-shrinkwrap.json +5143 -4990
  91. package/oclif.manifest.json +1 -1
  92. package/package.json +16 -11
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-B7pUDBYl.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-DRJf8q6R.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-BTC5XD8W.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-B-5a-soi.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-B7pUDBYl.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-BTC5XD8W.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-BTC5XD8W.js';
3
+ import { C as Command } from './Command-CWKSGrtu.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-B7pUDBYl.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-BTC5XD8W.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-B7pUDBYl.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-BTC5XD8W.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-B7pUDBYl.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-BTC5XD8W.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-DKibfocC.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-B7pUDBYl.js';
9
9
  import 'luxon';
10
10
  import 'node:crypto';
11
11
  import 'node:path';
@@ -19,12 +19,12 @@ 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-BTC5XD8W.js';
23
23
  import 'fullscreen-ink';
24
- import { u as useWebSocket } from './useWebSocket-CFc1M_mq.js';
25
- import { T as Title } from './Title-BCQtayg6.js';
24
+ import { u as useWebSocket } from './useWebSocket-DgYLiSrd.js';
26
25
  import stringLength from 'string-length';
27
26
  import stripAnsi from 'strip-ansi';
27
+ import { T as Title } from './Title-BCQtayg6.js';
28
28
 
29
29
  function arrayToDictionary(array, key = "id") {
30
30
  return array.reduce((a, i) => {
@@ -2,19 +2,19 @@ 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-B7pUDBYl.js';
6
+ import { k as cacheKeys, v as getFileHash, w as getPlatformName, x as getMessageColor } from './baseGameCommand-BTC5XD8W.js';
7
7
  import { ZipFile } from 'yazl';
8
8
  import { g as getCWDGitInfo } from './git-BpsfNFZ_.js';
9
9
  import { Readable, Transform } from 'stream';
10
10
  import { jsxs, jsx } from 'react/jsx-runtime';
11
11
  import { Box, Text } from 'ink';
12
- import 'ink-spinner';
13
12
  import { useState } from 'react';
13
+ import 'ink-spinner';
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-D-IhoJDu.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-B7pUDBYl.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-BTC5XD8W.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-D-IhoJDu.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-B7pUDBYl.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-AV_OlZEu.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-B7pUDBYl.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-BTC5XD8W.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-BTC5XD8W.js';
2
2
 
3
3
  class BaseAppleCommand extends BaseAuthenticatedCommand {
4
4
  async init() {
@@ -1,8 +1,8 @@
1
1
  import * as fs from 'node:fs';
2
2
  import fs__default from 'node:fs';
3
3
  import path__default from 'node:path';
4
- import chalk from 'chalk';
5
4
  import { Flags, Command } from '@oclif/core';
5
+ import chalk from 'chalk';
6
6
  import axios from 'axios';
7
7
  import { DateTime } from 'luxon';
8
8
  import * as expo from '@expo/apple-utils/build/index.js';
@@ -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
  }
@@ -481,7 +593,7 @@ async function getGodotAndroidPackageName() {
481
593
  }
482
594
  function getGodotVersion() {
483
595
  const projectGodotConfig = getGodotProjectConfig();
484
- const features = projectGodotConfig.get_value("application", "config/features");
596
+ const features = projectGodotConfig.get_value("application", "config/features", []);
485
597
  if (!features || features.length === 0) {
486
598
  return "3.6";
487
599
  }
@@ -743,4 +855,4 @@ class BaseCommand extends Command {
743
855
  }
744
856
  }
745
857
 
746
- export { acceptTerms as $, ApiKey as A, BaseCommand as B, CredentialsType as C, DetailsFlags as D, getProjectJobs as E, getJob as F, GODOT_CAPABILITIES as G, castArrayObjectDates as H, queryClient as I, JobStatus as J, WS_URL as K, getAuthToken as L, getProjectPlatformProgress as M, downloadBuildById as N, getGoogleStatus as O, Platform as P, getGodotAndroidPackageName as Q, enforcePolicy as R, revokePolicy as S, inviteServiceAccount as T, UserRole as U, disconnectGoogle as V, WEB_URL as W, getAPIKeys as X, createAPIKey as Y, revokeAPIKey as Z, getSingleUseUrl as _, ApiKeyType as a, setAuthToken as a0, Auth as a1, LogLevel as a2, getShortAuthRequiredUrl as a3, getNewUploadTicket as a4, startJobsFromUpload as a5, castObjectDates as a6, getGoogleAuthUrl as a7, castJobDates as a8, getShortTime as a9, updateProject as aa, BuildType as ab, getGradleBuildOptionKey as ac, getShortDateTime as ad, getShortTimeDelta as ae, JobStage as af, getSelf as ag, getTerms as ah, Certificate as b, getShortDate as c, getGodotAppleBundleIdentifier as d, BundleId as e, App as f, getProjects as g, CapabilityTypeOption as h, isGradleBuildEnabled as i, BetaGroup as j, isCWDGodotGame as k, getProject as l, CertificateType as m, Profile as n, ProfileType as o, API_URL as p, getAuthedHeaders as q, getGodotProjectCapabilities as r, setGradleBuildEnabled as s, CapabilityType as t, GameEngine as u, getGodotVersion as v, createProject as w, DEFAULT_SHIPPED_FILES_GLOBS as x, DEFAULT_IGNORED_FILES_GLOBS as y, getGodotProjectName as z };
858
+ 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, getGradleBuildOptionKey as ab, BuildType 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-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-B7pUDBYl.js';
2
+ import { c as BaseGameCommand, d as generatePackageName, b as getInput } from './baseGameCommand-BTC5XD8W.js';
3
3
 
4
4
  class BaseGameAndroidCommand extends BaseGameCommand {
5
5
  async checkGoogleAuth(waitForAuth = false) {