shipthis 0.1.43 → 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 (92) hide show
  1. package/README.md +16 -43
  2. package/dist/{AppleBundleIdDetails-bMqPqmP0.js → AppleBundleIdDetails-Cx8k-rYB.js} +5 -6
  3. package/dist/{Command-cqn3WLlP.js → Command-B2Qnw47r.js} +3 -4
  4. package/dist/{CommandGame-DMQT0sL_.js → CommandGame-C23_F55i.js} +2 -2
  5. package/dist/{Create-Cs9HG9xO.js → Create-BxNeKc2r.js} +2 -2
  6. package/dist/{GameStatus-lv2SW-6H.js → GameStatus-repzSNId.js} +2 -2
  7. package/dist/{Import-DOQrR8wW.js → Import-D6J9b-XO.js} +4 -5
  8. package/dist/{JobLogTail-CWYxQTq4.js → JobLogTail-CJWxpIq5.js} +4 -5
  9. package/dist/{JobProgress-B07Y2FLb.js → JobProgress-CISmKMuD.js} +3 -4
  10. package/dist/{JobStatusTable-B0A1z1zq.js → JobStatusTable-BEOu5MgG.js} +4 -5
  11. package/dist/{ProjectCredentialsTable-CyJ7o8yD.js → ProjectCredentialsTable-DR11Mn7W.js} +3 -4
  12. package/dist/{UserCredentialsTable-C8_skPFY.js → UserCredentialsTable-db4Xb8HC.js} +3 -4
  13. package/dist/{baseAppleCommand-Cfoy8Tx_.js → baseAppleCommand-YzhCAdUY.js} +1 -1
  14. package/dist/{baseCommand-B23l0hCp.js → baseCommand-ClUdS6Cn.js} +124 -24
  15. package/dist/{baseGameAndroidCommand-Dh4xXVW1.js → baseGameAndroidCommand-LdDRof_I.js} +2 -2
  16. package/dist/{baseGameCommand-P7Vyz2vZ.js → baseGameCommand-DQ6Wj-Pk.js} +43 -44
  17. package/dist/commands/apiKey/create.js +3 -4
  18. package/dist/commands/apiKey/list.js +3 -4
  19. package/dist/commands/apiKey/revoke.js +3 -4
  20. package/dist/commands/apple/apiKey/create.js +7 -8
  21. package/dist/commands/apple/apiKey/delete.js +5 -6
  22. package/dist/commands/apple/apiKey/export.js +6 -7
  23. package/dist/commands/apple/apiKey/import.js +6 -7
  24. package/dist/commands/apple/apiKey/status.js +5 -6
  25. package/dist/commands/apple/certificate/create.js +7 -8
  26. package/dist/commands/apple/certificate/delete.js +5 -6
  27. package/dist/commands/apple/certificate/export.js +6 -7
  28. package/dist/commands/apple/certificate/import.js +6 -7
  29. package/dist/commands/apple/certificate/status.js +5 -6
  30. package/dist/commands/apple/login.js +3 -4
  31. package/dist/commands/apple/status.js +4 -5
  32. package/dist/commands/dashboard.js +2 -3
  33. package/dist/commands/game/android/apiKey/connect.js +8 -9
  34. package/dist/commands/game/android/apiKey/create.js +11 -12
  35. package/dist/commands/game/android/apiKey/delete.js +5 -6
  36. package/dist/commands/game/android/apiKey/export.js +7 -8
  37. package/dist/commands/game/android/apiKey/import.js +7 -8
  38. package/dist/commands/game/android/apiKey/invite.js +3 -4
  39. package/dist/commands/game/android/apiKey/policy.js +3 -4
  40. package/dist/commands/game/android/apiKey/status.js +7 -8
  41. package/dist/commands/game/android/keyStore/create.js +8 -9
  42. package/dist/commands/game/android/keyStore/delete.js +5 -6
  43. package/dist/commands/game/android/keyStore/export.js +6 -7
  44. package/dist/commands/game/android/keyStore/import.js +9 -10
  45. package/dist/commands/game/android/keyStore/status.js +6 -7
  46. package/dist/commands/game/android/status.js +3 -4
  47. package/dist/commands/game/build/download.js +3 -4
  48. package/dist/commands/game/build/list.js +5 -6
  49. package/dist/commands/game/create.js +3 -4
  50. package/dist/commands/game/details.js +4 -5
  51. package/dist/commands/game/export.js +2 -3
  52. package/dist/commands/game/ios/app/addTester.js +5 -6
  53. package/dist/commands/game/ios/app/create.js +4 -5
  54. package/dist/commands/game/ios/app/status.js +7 -8
  55. package/dist/commands/game/ios/app/sync.js +5 -6
  56. package/dist/commands/game/ios/profile/create.js +10 -9
  57. package/dist/commands/game/ios/profile/delete.js +5 -6
  58. package/dist/commands/game/ios/profile/export.js +6 -7
  59. package/dist/commands/game/ios/profile/import.js +6 -7
  60. package/dist/commands/game/ios/profile/status.js +7 -8
  61. package/dist/commands/game/ios/status.js +9 -10
  62. package/dist/commands/game/ios/wizard.js +3 -4
  63. package/dist/commands/game/job/list.js +3 -4
  64. package/dist/commands/game/job/status.js +6 -7
  65. package/dist/commands/game/list.js +3 -4
  66. package/dist/commands/game/ship.js +8 -9
  67. package/dist/commands/game/status.js +6 -7
  68. package/dist/commands/game/wizard.js +16 -17
  69. package/dist/commands/internal/fastlane.js +3 -4
  70. package/dist/commands/internal/readme.js +4 -4
  71. package/dist/commands/login.js +2 -3
  72. package/dist/commands/status.js +4 -5
  73. package/dist/commands/util/android-build-method.js +3 -4
  74. package/dist/commands/util/glass.js +2 -3
  75. package/dist/{export-BOuZFMT3.js → export-Dq53OG06.js} +1 -1
  76. package/dist/{import-P4KcAuAO.js → import-CPAFgZO5.js} +1 -1
  77. package/dist/{index-AUjBYrSG.js → index-B-5yl-9h.js} +5 -6
  78. package/dist/{index-DMosmqi2.js → index-BMdQLpAh.js} +1 -1
  79. package/dist/{index-BmRSqi8U.js → index-ZQyiwS8O.js} +5 -6
  80. package/dist/{upload-BvNeNQXc.js → upload-BfWRd6ss.js} +1 -1
  81. package/dist/{useAppleApp-fD92orhh.js → useAppleApp-BZ1YvB2M.js} +1 -1
  82. package/dist/{useAppleBundleId-oONHtYgg.js → useAppleBundleId-CVBg5V7b.js} +1 -1
  83. package/dist/{useAppleProfiles-aMy844nZ.js → useAppleProfiles-BPZwJoCh.js} +2 -3
  84. package/dist/{useGoogleStatus-rBDZt9tw.js → useGoogleStatus-TpGFvpk5.js} +2 -2
  85. package/dist/{useProjectCredentials-DLYLMlJh.js → useProjectCredentials-Dv0DF2rA.js} +2 -2
  86. package/dist/{useWebSocket-Bvq2Wf7I.js → useWebSocket-Bj5fQveo.js} +1 -1
  87. package/docs/README.md +1 -0
  88. package/docs/autocomplete.md +64 -0
  89. package/docs/game/ios/app.md +11 -14
  90. package/npm-shrinkwrap.json +4629 -1903
  91. package/oclif.manifest.json +1 -1
  92. package/package.json +33 -17
package/README.md CHANGED
@@ -49,6 +49,8 @@ The wizard command takes a platform parameter: either **android** or **ios**. Ru
49
49
 
50
50
  #### Set up an Android game
51
51
 
52
+ Read more about [how ShipThis exports Godot Android games](https://shipth.is/docs/guides/android-export-methods?ref=github_readme) (Gradle vs legacy, APK/AAB output).
53
+
52
54
  ```bash
53
55
  shipthis game wizard android
54
56
  ```
@@ -89,6 +91,7 @@ Now you can publish new versions of your game to TestFlight or Google Play with
89
91
  shipthis game ship
90
92
  ```
91
93
 
94
+ - New to ShipThis? See the full [Quick start guide](https://shipth.is/docs/guides/quick-start?ref=github_readme)
92
95
  - Having issues? Check the [Troubleshooting](https://shipth.is/docs/troubleshooting?ref=github_readme) or [join our Discord](https://discord.gg/gPjn3S99k4)
93
96
  - For detailed documentation, visit [shipth.is/docs](https://shipth.is/docs?ref=github_readme)
94
97
 
@@ -106,7 +109,7 @@ We support **all stable Godot versions since 3.6**, including:
106
109
 
107
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) |
108
111
  | ----------------------------------------------------------------------- | ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------ |
109
- | [3.6.1](https://github.com/godotengine/godot/releases/tag/3.6.1-stable) | [4.0.1](https://github.com/godotengine/godot/releases/tag/4.0.1-stable) | [4.1.1](https://github.com/godotengine/godot/releases/tag/4.1.1-stable) | [4.2.1](https://github.com/godotengine/godot/releases/tag/4.2.1-stable) | [4.3.1 *](https://github.com/shipth-is/godot-android-sdk-upgrade/releases/tag/4.3.1-28eb575) | [4.4.1](https://github.com/godotengine/godot/releases/tag/4.4.1-stable) | [4.5.1](https://github.com/godotengine/godot/releases/tag/4.5.1-stable) | |
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) |
110
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) | | |
111
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) | | | | |
112
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) | | | | | |
@@ -365,49 +368,9 @@ We store:
365
368
 
366
369
  ### What happens to my files when I run the command `shipthis game ship`?
367
370
 
368
- #### 1. Uploading your game files
369
-
370
- When you run the command, the CLI asks the ShipThis backend for a secure (HTTPS) temporary upload URL.
371
- Your game files are packaged locally on your machine:
372
-
373
- - Files matching `shippedFilesGlobs` in `shipthis.json` are included
374
- - Files matching `ignoredFilesGlobs` are excluded
375
-
376
- The zip file is then uploaded directly from your computer to a private DigitalOcean Space using the temporary upload URL.
377
-
378
- #### 2. Where the files are stored
379
-
380
- The uploaded zip lives in a private DigitalOcean Space. The space is not public and cannot be browsed.
381
-
382
- 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.
383
-
384
- This storage is used for:
385
-
386
- - Providing a build machine access to your game files
387
- - Storing the resulting build outputs (APK/AAB/IPA)
388
-
389
- #### 3. How build machines access your code
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.
390
372
 
391
- Build machines do not have general access to storage of game files or credentials.
392
-
393
- 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.
394
-
395
- Build machines cannot browse files or access anything outside the job that they are currently running.
396
-
397
- #### 4. Cleanup after the build
398
-
399
- After a build machine has completed a job, a cleanup routine is run which deletes:
400
-
401
- - Downloaded and extracted game files
402
- - Build intermediates
403
- - Temporary files
404
-
405
- The build machines do not keep user files after a job completes.
406
-
407
- #### 5. Retention and deletion
408
-
409
- - Uploaded game file zips and build outputs (APK/AAB/IPA) are retained for **30 days**
410
- - 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.
411
374
 
412
375
  ## 📖 Command Reference
413
376
 
@@ -420,11 +383,21 @@ The build machines do not keep user files after a job completes.
420
383
 
421
384
  ### 🔧 Commands
422
385
 
386
+ - [autocomplete](https://shipth.is/docs/reference/autocomplete?ref=github_readme) - Set up shell tab-completion for commands, topics, and flags
423
387
  - [dashboard](https://shipth.is/docs/reference/dashboard?ref=github_readme) - Opens the web browser to your shipth.is dashboard
424
388
  - [login](https://shipth.is/docs/reference/login?ref=github_readme) - Sign in or create a new account
425
389
  - [status](https://shipth.is/docs/reference/status?ref=github_readme) - Display your overall ShipThis account status
426
390
  - [help](https://shipth.is/docs/reference/help?ref=github_readme) - Display help for a specific topic or command
427
391
 
392
+ ### 📚 Guides
393
+
394
+ - [Quick start](https://shipth.is/docs/guides/quick-start?ref=github_readme) - Get your first build running in minutes
395
+ - [Android export methods](https://shipth.is/docs/guides/android-export-methods?ref=github_readme) - Gradle vs legacy builds, APK & AAB output
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
398
+ - [Liquid Glass icons](https://shipth.is/docs/guides/liquid-glass?ref=github_readme) - Use Liquid Glass icons with your iOS game
399
+ - [Troubleshooting](https://shipth.is/docs/troubleshooting?ref=github_readme) - Common issues and how to fix them
400
+
428
401
  ## 🌍 Community
429
402
 
430
403
  - 💬 [Join us on Discord](https://discord.gg/gPjn3S99k4)
@@ -11,14 +11,13 @@ import 'readline-sync';
11
11
  import 'luxon';
12
12
  import 'axios';
13
13
  import 'isomorphic-git';
14
- import './baseCommand-B23l0hCp.js';
14
+ import './baseCommand-ClUdS6Cn.js';
15
15
  import '@oclif/core';
16
16
  import '@tanstack/react-query';
17
17
  import 'react';
18
- import 'crypto-js';
19
- import 'uuid';
20
- import { u as useAppleApp } from './useAppleApp-fD92orhh.js';
18
+ import { u as useAppleApp } from './useAppleApp-BZ1YvB2M.js';
21
19
  import 'fast-glob';
20
+ import 'uuid';
22
21
  import 'socket.io-client';
23
22
  import 'fullscreen-ink';
24
23
  import 'stream';
@@ -28,12 +27,12 @@ import 'strip-ansi';
28
27
  import { T as Table } from './Table-FaNgpyeq.js';
29
28
  import { T as Title } from './Title-BCQtayg6.js';
30
29
  import 'open';
31
- import './baseGameCommand-P7Vyz2vZ.js';
30
+ import './baseGameCommand-DQ6Wj-Pk.js';
32
31
  import 'godot-export-presets';
33
32
  import 'marked';
34
33
  import 'marked-terminal';
35
34
  import 'qrcode';
36
- import { u as useAppleBundleId } from './useAppleBundleId-oONHtYgg.js';
35
+ import { u as useAppleBundleId } from './useAppleBundleId-CVBg5V7b.js';
37
36
 
38
37
  const AppleAppDetails = (props) => {
39
38
  const { data, isLoading } = useAppleApp(props);
@@ -2,11 +2,9 @@ import { jsx } from 'react/jsx-runtime';
2
2
  import { QueryClientProvider } from '@tanstack/react-query';
3
3
  import { useScreenSize } from 'fullscreen-ink';
4
4
  import { Box } from 'ink';
5
- import { I as queryClient } from './baseCommand-B23l0hCp.js';
5
+ import { I as queryClient } from './baseCommand-ClUdS6Cn.js';
6
6
  import 'axios';
7
7
  import 'node:fs';
8
- import 'crypto-js';
9
- import 'uuid';
10
8
  import 'luxon';
11
9
  import 'node:crypto';
12
10
  import 'node:path';
@@ -20,7 +18,8 @@ import 'socket.io-client';
20
18
  import 'stream';
21
19
  import 'yazl';
22
20
  import 'fast-glob';
23
- import { C as CommandProvider } from './baseGameCommand-P7Vyz2vZ.js';
21
+ import 'uuid';
22
+ import { C as CommandProvider } from './baseGameCommand-DQ6Wj-Pk.js';
24
23
 
25
24
  const Command = ({ children, command }) => {
26
25
  const { width } = useScreenSize();
@@ -1,6 +1,6 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
- import { G as GameProvider } from './baseGameCommand-P7Vyz2vZ.js';
3
- import { C as Command } from './Command-cqn3WLlP.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-B23l0hCp.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-P7Vyz2vZ.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-B23l0hCp.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-P7Vyz2vZ.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,12 +11,11 @@ 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-B23l0hCp.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
- import 'crypto-js';
18
- import { v4 } from 'uuid';
19
17
  import 'fast-glob';
18
+ import { v4 } from 'uuid';
20
19
  import 'socket.io-client';
21
20
  import 'fullscreen-ink';
22
21
  import 'stream';
@@ -25,12 +24,12 @@ import 'string-length';
25
24
  import 'strip-ansi';
26
25
  import 'open';
27
26
  import '@inkjs/ui';
28
- import { k as cacheKeys, i as GameContext } from './baseGameCommand-P7Vyz2vZ.js';
27
+ import { k as cacheKeys, i as GameContext } from './baseGameCommand-DQ6Wj-Pk.js';
29
28
  import 'marked';
30
29
  import 'marked-terminal';
31
30
  import 'qrcode';
32
31
  import 'godot-export-presets';
33
- import { i as importCredential } from './import-P4KcAuAO.js';
32
+ import { i as importCredential } from './import-CPAFgZO5.js';
34
33
 
35
34
  async function importKeystore({ log = () => {
36
35
  }, ...opt }) {
@@ -5,9 +5,7 @@ import { useInfiniteQuery } from '@tanstack/react-query';
5
5
  import axios from 'axios';
6
6
  import { useState, useRef, useEffect } from 'react';
7
7
  import 'node:fs';
8
- import 'crypto-js';
9
- import 'uuid';
10
- import { q as getAuthedHeaders, p as API_URL, H as castArrayObjectDates, J as JobStatus, a8 as castJobDates, a6 as castObjectDates, a9 as getShortTime } from './baseCommand-B23l0hCp.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';
11
9
  import 'luxon';
12
10
  import 'node:crypto';
13
11
  import 'node:path';
@@ -19,10 +17,11 @@ import '@oclif/core';
19
17
  import 'stream';
20
18
  import 'yazl';
21
19
  import 'fast-glob';
20
+ import 'uuid';
22
21
  import 'socket.io-client';
23
- import { k as cacheKeys, y as useJob, h as getStageColor, x as getMessageColor } from './baseGameCommand-P7Vyz2vZ.js';
22
+ import { k as cacheKeys, y as useJob, h as getStageColor, x as getMessageColor } from './baseGameCommand-DQ6Wj-Pk.js';
24
23
  import 'fullscreen-ink';
25
- import { u as useWebSocket } from './useWebSocket-Bvq2Wf7I.js';
24
+ import { u as useWebSocket } from './useWebSocket-Bj5fQveo.js';
26
25
  import { T as Title } from './Title-BCQtayg6.js';
27
26
  import stringLength from 'string-length';
28
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-B23l0hCp.js';
6
- import { k as cacheKeys, v as getFileHash, w as getPlatformName, x as getMessageColor } from './baseGameCommand-P7Vyz2vZ.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';
@@ -12,10 +12,9 @@ import { Box, Text } from 'ink';
12
12
  import 'ink-spinner';
13
13
  import { useState } from 'react';
14
14
  import 'axios';
15
- import 'crypto-js';
16
15
  import 'luxon';
17
16
  import 'socket.io-client';
18
- import { u as useJobWatching, a as JobLogLine } from './JobLogTail-CWYxQTq4.js';
17
+ import { u as useJobWatching, a as JobLogLine } from './JobLogTail-CJWxpIq5.js';
19
18
  import 'fullscreen-ink';
20
19
  import 'open';
21
20
  import '@inkjs/ui';
@@ -3,16 +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-B23l0hCp.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 'crypto-js';
11
- import 'uuid';
12
- import { e as getJobSummary, h as getStageColor, f as getJobStatusColor } from './baseGameCommand-P7Vyz2vZ.js';
10
+ import { e as getJobSummary, h as getStageColor, f as getJobStatusColor } from './baseGameCommand-DQ6Wj-Pk.js';
13
11
  import 'fast-glob';
12
+ import 'uuid';
14
13
  import 'socket.io-client';
15
- import { u as useJobWatching } from './JobLogTail-CWYxQTq4.js';
14
+ import { u as useJobWatching } from './JobLogTail-CJWxpIq5.js';
16
15
  import 'fullscreen-ink';
17
16
  import { a as StatusRow, b as StatusRowLabel } from './StatusTable-DzRWcMr4.js';
18
17
  import { T as Title } from './Title-BCQtayg6.js';
@@ -10,14 +10,13 @@ import 'readline-sync';
10
10
  import 'luxon';
11
11
  import 'axios';
12
12
  import 'isomorphic-git';
13
- import './baseCommand-B23l0hCp.js';
13
+ import './baseCommand-ClUdS6Cn.js';
14
14
  import '@oclif/core';
15
15
  import '@tanstack/react-query';
16
16
  import 'react';
17
- import 'crypto-js';
18
- import 'uuid';
19
- import { u as useProjectCredentials, g as getProjectCredentialSummary } from './useProjectCredentials-DLYLMlJh.js';
17
+ import { u as useProjectCredentials, g as getProjectCredentialSummary } from './useProjectCredentials-Dv0DF2rA.js';
20
18
  import 'fast-glob';
19
+ import 'uuid';
21
20
  import 'socket.io-client';
22
21
  import 'fullscreen-ink';
23
22
  import 'stream';
@@ -10,14 +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-B23l0hCp.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
- import 'crypto-js';
18
- import 'uuid';
19
17
  import 'fast-glob';
20
- import { k as cacheKeys, g as getShortUUID } from './baseGameCommand-P7Vyz2vZ.js';
18
+ import 'uuid';
19
+ import { k as cacheKeys, g as getShortUUID } from './baseGameCommand-DQ6Wj-Pk.js';
21
20
  import 'socket.io-client';
22
21
  import 'fullscreen-ink';
23
22
  import 'stream';
@@ -1,4 +1,4 @@
1
- import { B as BaseAuthenticatedCommand } from './baseGameCommand-P7Vyz2vZ.js';
1
+ import { B as BaseAuthenticatedCommand } from './baseGameCommand-DQ6Wj-Pk.js';
2
2
 
3
3
  class BaseAppleCommand extends BaseAuthenticatedCommand {
4
4
  async init() {
@@ -4,8 +4,6 @@ import path__default from 'node:path';
4
4
  import chalk from 'chalk';
5
5
  import { Flags, Command } from '@oclif/core';
6
6
  import axios from 'axios';
7
- import CryptoJS from 'crypto-js';
8
- import { v4 } from 'uuid';
9
7
  import { DateTime } from 'luxon';
10
8
  import * as expo from '@expo/apple-utils/build/index.js';
11
9
  import 'node:crypto';
@@ -17,6 +15,7 @@ import { getMajorVersion, loadExportPresets, findPreset, getBasePreset, saveExpo
17
15
  import { QueryClient } from '@tanstack/react-query';
18
16
  import 'react';
19
17
  import 'fast-glob';
18
+ import 'uuid';
20
19
  import 'socket.io-client';
21
20
  import 'fullscreen-ink';
22
21
  import 'ink';
@@ -237,23 +236,12 @@ async function getSingleUseUrl(destination) {
237
236
  return url;
238
237
  }
239
238
  async function getShortAuthRequiredUrl(destination) {
240
- const { email } = await getSelf();
241
- const key = v4();
242
- const salt = "Na (s) + 1/2 Cl\u2082 (g) \u2192 NaCl (s)";
243
- const fullKey = `${key}${salt}`;
244
- const token = CryptoJS.AES.encrypt(email, fullKey).toString();
245
- const params = {
246
- destination,
247
- key,
248
- token
249
- };
250
- const queryString = Object.entries(params).map(([key2, value]) => `${key2}=${encodeURIComponent(`${value}`)}`).join("&");
251
- const url = `${WEB_URL}login/?${queryString}`;
252
239
  const headers = await getAuthedHeaders();
253
240
  const { data } = await axios.post(
254
- `${API_URL}/me/shorten`,
241
+ `${API_URL}/me/login-link`,
255
242
  {
256
- url
243
+ destination,
244
+ webUrl: WEB_URL
257
245
  },
258
246
  { headers }
259
247
  );
@@ -434,23 +422,135 @@ var BuildType = /* @__PURE__ */ ((BuildType2) => {
434
422
  return BuildType2;
435
423
  })(BuildType || {});
436
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
+
437
504
  function isCWDGodotGame() {
438
505
  const cwd = process.cwd();
439
506
  const godotProject = path__default.join(cwd, "project.godot");
440
507
  return fs__default.existsSync(godotProject);
441
508
  }
442
- const GODOT_CAPABILITIES = [
443
- // TODO: how about capabilities from godot extensions
509
+ const GODOT_SYNCABLE_CAPABILITIES = [
444
510
  { key: "capabilities/access_wifi", name: "Access WiFi", type: CapabilityType.ACCESS_WIFI },
445
- { 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
+ }))
446
523
  ];
447
- async function getGodotProjectCapabilities(platform) {
448
- const exportPresets = await getGodotExportPresets(platform);
449
- 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 ?? {};
450
539
  const capabilities = [];
451
- 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
+ }
452
545
  if (!(capability.key in options)) continue;
453
- 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);
454
554
  }
455
555
  return capabilities;
456
556
  }
@@ -1,5 +1,5 @@
1
- import { O as getGoogleStatus, Q as getGodotAndroidPackageName } from './baseCommand-B23l0hCp.js';
2
- import { c as BaseGameCommand, d as generatePackageName, b as getInput } from './baseGameCommand-P7Vyz2vZ.js';
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) {