shipthis 0.1.10 → 0.1.12

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 (155) hide show
  1. package/assets/markdown/create-or-import-keystore.md +7 -0
  2. package/dist/{AppleBundleIdDetails-DKeSAte9.js → AppleBundleIdDetails-DymjrhOZ.js} +1 -1
  3. package/dist/{CommandGame--SAa3wEL.js → CommandGame-C1oTlfdb.js} +1 -1
  4. package/dist/{CreateKeystore-g1z6DsU5.js → Create-DIaSKUpl.js} +5 -5
  5. package/dist/Import-BIOsf8AA.js +107 -0
  6. package/dist/{JobProgress-jmGAzvxS.js → JobProgress-W0QQR49T.js} +2 -2
  7. package/dist/{JobStatusTable-ByW0bN6c.js → JobStatusTable-DqoppRro.js} +2 -2
  8. package/dist/commands/apple/apiKey/create.js +4 -4
  9. package/dist/commands/apple/apiKey/export.js +3 -3
  10. package/dist/commands/apple/apiKey/import.js +4 -4
  11. package/dist/commands/apple/apiKey/status.js +3 -3
  12. package/dist/commands/apple/certificate/create.js +4 -4
  13. package/dist/commands/apple/certificate/export.js +3 -3
  14. package/dist/commands/apple/certificate/import.js +4 -4
  15. package/dist/commands/apple/certificate/status.js +3 -3
  16. package/dist/commands/apple/status.js +3 -3
  17. package/dist/commands/game/android/apiKey/connect.js +6 -6
  18. package/dist/commands/game/android/apiKey/create.js +6 -6
  19. package/dist/commands/game/android/apiKey/export.js +3 -3
  20. package/dist/commands/game/android/apiKey/import.js +4 -4
  21. package/dist/commands/game/android/apiKey/status.js +3 -3
  22. package/dist/commands/game/android/keyStore/create.js +7 -7
  23. package/dist/commands/game/android/keyStore/export.js +3 -3
  24. package/dist/commands/game/android/keyStore/import.js +45 -25
  25. package/dist/commands/game/android/keyStore/status.js +3 -3
  26. package/dist/commands/game/android/status.js +5 -5
  27. package/dist/commands/game/build/download.js +4 -4
  28. package/dist/commands/game/build/list.js +4 -4
  29. package/dist/commands/game/details.js +3 -3
  30. package/dist/commands/game/ios/app/addTester.js +3 -3
  31. package/dist/commands/game/ios/app/create.js +3 -3
  32. package/dist/commands/game/ios/app/status.js +4 -4
  33. package/dist/commands/game/ios/app/sync.js +3 -3
  34. package/dist/commands/game/ios/profile/create.js +4 -4
  35. package/dist/commands/game/ios/profile/export.js +3 -3
  36. package/dist/commands/game/ios/profile/import.js +4 -4
  37. package/dist/commands/game/ios/profile/status.js +3 -3
  38. package/dist/commands/game/ios/status.js +6 -6
  39. package/dist/commands/game/job/list.js +5 -5
  40. package/dist/commands/game/job/status.js +7 -7
  41. package/dist/commands/game/list.js +5 -5
  42. package/dist/commands/game/ship.js +7 -7
  43. package/dist/commands/game/status.js +5 -5
  44. package/dist/commands/game/wizard.js +116 -17
  45. package/dist/commands/status.js +3 -3
  46. package/dist/{import-7T3J63j2.js → import-v54PM_Qg.js} +11 -2
  47. package/dist/{index-m4HTrJ5J.js → index-D6BH5UAM.js} +3 -3
  48. package/dist/{index-DgbQBx6x.js → index-o9Y-84Rj.js} +1 -1
  49. package/dist/{useJobWatching-D-YzSlK8.js → useJobWatching-I_A3b36f.js} +1 -1
  50. package/npm-shrinkwrap.json +2 -2
  51. package/oclif.manifest.json +27 -86
  52. package/package.json +1 -1
  53. package/dist/AppleBundleIdDetails-C0XqjxKJ.js +0 -72
  54. package/dist/AppleBundleIdDetails-CjP5y0cj.js +0 -74
  55. package/dist/AppleBundleIdDetails-CztWY_mT.js +0 -73
  56. package/dist/AppleBundleIdDetails-Df30MPFC.js +0 -73
  57. package/dist/AppleBundleIdDetails-Dxo99Sgu.js +0 -72
  58. package/dist/Command-1YAl_0zS.js +0 -204
  59. package/dist/Command-Cl-JfhTy.js +0 -203
  60. package/dist/Command-Dn0P_KOV.js +0 -205
  61. package/dist/Command-DxmQn3XT.js +0 -204
  62. package/dist/Command-YJJp90ru.js +0 -204
  63. package/dist/CommandGame-CZUx_VQu.js +0 -8
  64. package/dist/CommandGame-DspVLTPZ.js +0 -8
  65. package/dist/CommandGame-cPaTk1wh.js +0 -8
  66. package/dist/CommandGame-k04mHiDl.js +0 -8
  67. package/dist/CommandGame-pI9VXKxi.js +0 -8
  68. package/dist/CreateKeystore-BnNdeDUa.js +0 -57
  69. package/dist/CreateKeystore-BqJdpvsI.js +0 -56
  70. package/dist/CreateKeystore-Cf-nsK_M.js +0 -56
  71. package/dist/CreateKeystore-D8uTRamD.js +0 -56
  72. package/dist/CreateKeystore-Dm0KVh85.js +0 -56
  73. package/dist/JobProgress-CPkWVSlH.js +0 -108
  74. package/dist/JobProgress-Dk0UoNah.js +0 -108
  75. package/dist/JobProgress-biiLhigg.js +0 -109
  76. package/dist/JobStatusTable-BA_q-kgE.js +0 -75
  77. package/dist/JobStatusTable-CgaTS7jS.js +0 -75
  78. package/dist/JobStatusTable-q4atKzhu.js +0 -75
  79. package/dist/ProjectCredentialsTable-BIWBAXCh.js +0 -37
  80. package/dist/ProjectCredentialsTable-Ch8022rs.js +0 -37
  81. package/dist/ProjectCredentialsTable-DRMK_SNw.js +0 -37
  82. package/dist/ProjectCredentialsTable-DfkpvTf8.js +0 -37
  83. package/dist/UserCredentialsTable-CeJS3_hd.js +0 -82
  84. package/dist/UserCredentialsTable-DMh8Wpy7.js +0 -82
  85. package/dist/UserCredentialsTable-DgHZJSHG.js +0 -82
  86. package/dist/UserCredentialsTable-ysmM5dlV.js +0 -82
  87. package/dist/baseAppleCommand-1isaFxCQ.js +0 -10
  88. package/dist/baseAppleCommand-B3WQtlx-.js +0 -10
  89. package/dist/baseAppleCommand-D-G4h8zQ.js +0 -10
  90. package/dist/baseAppleCommand-DpasCbje.js +0 -10
  91. package/dist/baseGameAndroidCommand-B-CFhPnE.js +0 -43
  92. package/dist/baseGameAndroidCommand-B3LRG701.js +0 -43
  93. package/dist/baseGameAndroidCommand-C9BuS2Sr.js +0 -43
  94. package/dist/baseGameAndroidCommand-DD0H8iy-.js +0 -43
  95. package/dist/commands/game/android/wizard.js +0 -509
  96. package/dist/export-BDxGDZdh.js +0 -36
  97. package/dist/export-B_F6vXIK.js +0 -36
  98. package/dist/export-BiLHgSJ9.js +0 -36
  99. package/dist/export-C_lu1FD9.js +0 -36
  100. package/dist/import-Brg3zYmT.js +0 -38
  101. package/dist/import-BrlJuE2Z.js +0 -38
  102. package/dist/import-CxNikF1c.js +0 -38
  103. package/dist/import-DPbg8WvS.js +0 -38
  104. package/dist/index-B5XHQfs2.js +0 -122
  105. package/dist/index-B6V7vGOj.js +0 -136
  106. package/dist/index-BDFKyTPb.js +0 -24
  107. package/dist/index-BL-1G60K.js +0 -135
  108. package/dist/index-BQRxiyqn.js +0 -693
  109. package/dist/index-BQnkBr1Q.js +0 -136
  110. package/dist/index-BX9h2vPV.js +0 -123
  111. package/dist/index-BjGSEqP5.js +0 -135
  112. package/dist/index-BuZmCvZh.js +0 -24
  113. package/dist/index-Bv3x8c78.js +0 -693
  114. package/dist/index-ByOvCs4O.js +0 -122
  115. package/dist/index-BzffuqPa.js +0 -24
  116. package/dist/index-C9734Cj2.js +0 -693
  117. package/dist/index-CKYExssR.js +0 -136
  118. package/dist/index-CgBgZUkL.js +0 -144
  119. package/dist/index-DBrQda8r.js +0 -122
  120. package/dist/index-DE2Hvx2o.js +0 -122
  121. package/dist/index-DdABTtYO.js +0 -693
  122. package/dist/index-DxHPjZav.js +0 -136
  123. package/dist/index-X__XH_Fd.js +0 -144
  124. package/dist/index-wyPoxiTc.js +0 -136
  125. package/dist/upload-CMo3hUhl.js +0 -60
  126. package/dist/upload-Cx71802W.js +0 -60
  127. package/dist/upload-DvAE1vDq.js +0 -60
  128. package/dist/upload-LXRr4pMa.js +0 -60
  129. package/dist/useAndroidServiceAccountTestResult-BDc7XpKE.js +0 -52
  130. package/dist/useAndroidServiceAccountTestResult-B_ekRewZ.js +0 -52
  131. package/dist/useAndroidServiceAccountTestResult-D_30xIJA.js +0 -52
  132. package/dist/useAndroidServiceAccountTestResult-InDf5WSl.js +0 -52
  133. package/dist/useAppleApp-CApC0-4Q.js +0 -32
  134. package/dist/useAppleApp-CETIcsJS.js +0 -32
  135. package/dist/useAppleApp-DgE0wEaq.js +0 -32
  136. package/dist/useAppleApp-DnSjUfSs.js +0 -32
  137. package/dist/useAppleBundleId-BNI8swhC.js +0 -64
  138. package/dist/useAppleBundleId-DtLODy3p.js +0 -64
  139. package/dist/useAppleBundleId-SmzY6rkm.js +0 -64
  140. package/dist/useAppleBundleId-gPBzJwQg.js +0 -64
  141. package/dist/useJobWatching-BIG6fnTN.js +0 -45
  142. package/dist/useJobWatching-BcBJ5dy1.js +0 -43
  143. package/dist/useJobWatching-Bz1e6xOv.js +0 -43
  144. package/dist/useJobWatching-Cp-CYd90.js +0 -45
  145. package/dist/useJobWatching-P5oC7mNB.js +0 -45
  146. package/dist/useProjectCredentials-B5ZmpIxL.js +0 -54
  147. package/dist/useProjectCredentials-BRffcsO3.js +0 -54
  148. package/dist/useProjectCredentials-CKngz2rd.js +0 -54
  149. package/dist/useProjectCredentials-EapDge1I.js +0 -54
  150. package/dist/useWebSocket-Bep1zAVG.js +0 -36
  151. package/dist/useWebSocket-D8PojLtx.js +0 -36
  152. package/dist/useWebSocket-DoImIdTy.js +0 -36
  153. package/dist/useWebSocket-rBLiZsKb.js +0 -36
  154. package/dist/wizard-ChPegnMW.js +0 -133
  155. package/dist/{Command-D6rWEZRM.js → Command-BiB9MqbJ.js} +3 -3
@@ -3,24 +3,24 @@ import { Args, Flags } from '@oclif/core';
3
3
  import { measureElement, Box, Text, render } from 'ink';
4
4
  import { p as getAuthedHeaders, q as API_URL, K as castArrayObjectDates, F as castObjectDates, a4 as getShortTime, c as BaseGameCommand, a5 as getJob, J as JobStatus } from '../../../index-BB7X1Pqp.js';
5
5
  import { useState, useEffect, useRef } from 'react';
6
- import { C as Command } from '../../../Command-D6rWEZRM.js';
6
+ import { C as Command } from '../../../Command-BiB9MqbJ.js';
7
7
  import Spinner from 'ink-spinner';
8
8
  import '@inkjs/ui';
9
9
  import axios from 'axios';
10
10
  import { useInfiniteQuery } from '@tanstack/react-query';
11
- import 'open';
12
- import 'crypto';
13
11
  import 'fs';
12
+ import 'uuid';
13
+ import 'yazl';
14
+ import 'crypto';
14
15
  import 'readline-sync';
15
16
  import 'node:readline';
16
17
  import 'node:path';
17
18
  import 'node:url';
18
19
  import 'luxon';
19
- import 'uuid';
20
20
  import 'fast-glob';
21
- import 'yazl';
22
21
  import 'socket.io-client';
23
22
  import 'isomorphic-git';
23
+ import 'open';
24
24
  import { N as NextSteps } from '../../../NextSteps-CK9zHOCt.js';
25
25
  import 'qrcode';
26
26
  import stringLength from 'string-length';
@@ -30,14 +30,14 @@ import 'crypto-js';
30
30
  import { c as cacheKeys } from '../../../useAndroidServiceAccountTestResult-Ce1x0Eh8.js';
31
31
  import { u as useWebSocket } from '../../../useWebSocket-CBqsjHbt.js';
32
32
  import { T as Title } from '../../../Title-BCQtayg6.js';
33
- import { J as JobStatusTable } from '../../../JobStatusTable-ByW0bN6c.js';
33
+ import { J as JobStatusTable } from '../../../JobStatusTable-DqoppRro.js';
34
34
  import 'path';
35
35
  import '@expo/apple-utils/build/index.js';
36
36
  import 'ini';
37
37
  import 'deepmerge';
38
38
  import 'marked';
39
39
  import 'marked-terminal';
40
- import '../../../useJobWatching-D-YzSlK8.js';
40
+ import '../../../useJobWatching-I_A3b36f.js';
41
41
  import '../../../StatusTable-Dm5St4g-.js';
42
42
 
43
43
  async function queryJobLogs({
@@ -3,22 +3,22 @@ import { render, Text, Box } from 'ink';
3
3
  import { Flags } from '@oclif/core';
4
4
  import { B as BaseAuthenticatedCommand, g as getProjects, b as getShortDate } from '../../index-BB7X1Pqp.js';
5
5
  import 'react';
6
- import { C as Command } from '../../Command-D6rWEZRM.js';
6
+ import { C as Command } from '../../Command-BiB9MqbJ.js';
7
7
  import 'ink-spinner';
8
8
  import '@inkjs/ui';
9
9
  import 'axios';
10
10
  import '@tanstack/react-query';
11
- import 'open';
11
+ import 'fs';
12
+ import 'uuid';
13
+ import 'yazl';
12
14
  import { g as getShortUUID } from '../../index-Cz_KLwWf.js';
15
+ import 'open';
13
16
  import 'qrcode';
14
17
  import { T as Table } from '../../Table-CvM6pccN.js';
15
18
  import 'string-length';
16
19
  import 'strip-ansi';
17
20
  import 'luxon';
18
- import 'uuid';
19
21
  import 'fast-glob';
20
- import 'fs';
21
- import 'yazl';
22
22
  import 'socket.io-client';
23
23
  import 'path';
24
24
  import '@expo/apple-utils/build/index.js';
@@ -2,7 +2,7 @@ import { jsxs, jsx } from 'react/jsx-runtime';
2
2
  import { c as BaseGameCommand } from '../../index-BB7X1Pqp.js';
3
3
  import { useContext, useState, useEffect } from 'react';
4
4
  import { Box, Text, render } from 'ink';
5
- import { c as CommandContext } from '../../Command-D6rWEZRM.js';
5
+ import { c as CommandContext } from '../../Command-BiB9MqbJ.js';
6
6
  import 'ink-spinner';
7
7
  import 'axios';
8
8
  import 'crypto-js';
@@ -11,23 +11,23 @@ import 'luxon';
11
11
  import 'fs';
12
12
  import '@inkjs/ui';
13
13
  import '@tanstack/react-query';
14
- import 'open';
14
+ import 'yazl';
15
15
  import 'crypto';
16
16
  import 'readline-sync';
17
17
  import 'node:readline';
18
18
  import 'node:path';
19
19
  import 'node:url';
20
20
  import 'fast-glob';
21
- import 'yazl';
22
21
  import 'socket.io-client';
23
22
  import 'isomorphic-git';
24
23
  import '@oclif/core';
24
+ import 'open';
25
25
  import 'qrcode';
26
26
  import 'string-length';
27
27
  import 'strip-ansi';
28
- import { C as CommandGame } from '../../CommandGame-cPaTk1wh.js';
29
- import { u as useShip, J as JobProgress } from '../../JobProgress-jmGAzvxS.js';
30
- import { J as JobStatusTable } from '../../JobStatusTable-ByW0bN6c.js';
28
+ import { C as CommandGame } from '../../CommandGame-C1oTlfdb.js';
29
+ import { u as useShip, J as JobProgress } from '../../JobProgress-W0QQR49T.js';
30
+ import { J as JobStatusTable } from '../../JobStatusTable-DqoppRro.js';
31
31
  import 'path';
32
32
  import '@expo/apple-utils/build/index.js';
33
33
  import 'ini';
@@ -38,7 +38,7 @@ import 'marked';
38
38
  import 'marked-terminal';
39
39
  import '../../git-DREGq-jc.js';
40
40
  import '../../ProgressSpinner-6pw1T8Iw.js';
41
- import '../../useJobWatching-D-YzSlK8.js';
41
+ import '../../useJobWatching-I_A3b36f.js';
42
42
  import '../../useWebSocket-CBqsjHbt.js';
43
43
  import '../../Title-BCQtayg6.js';
44
44
  import '../../StatusTable-Dm5St4g-.js';
@@ -2,24 +2,24 @@ import { jsxs, jsx } from 'react/jsx-runtime';
2
2
  import { render } from 'ink';
3
3
  import { Flags } from '@oclif/core';
4
4
  import 'react';
5
- import { C as Command } from '../../Command-D6rWEZRM.js';
5
+ import { C as Command } from '../../Command-BiB9MqbJ.js';
6
6
  import { B as BaseAuthenticatedCommand, H as getProject, P as Platform, k as getProjectPlatformProgress, b as getShortDate } from '../../index-BB7X1Pqp.js';
7
7
  import 'ink-spinner';
8
8
  import '@inkjs/ui';
9
9
  import 'axios';
10
10
  import '@tanstack/react-query';
11
- import 'open';
11
+ import 'fs';
12
+ import 'uuid';
13
+ import 'yazl';
12
14
  import { g as getShortUUID, m as makeHumanReadable } from '../../index-Cz_KLwWf.js';
15
+ import 'open';
13
16
  import { N as NextSteps } from '../../NextSteps-CK9zHOCt.js';
14
17
  import 'qrcode';
15
18
  import { S as StatusTable } from '../../StatusTable-Dm5St4g-.js';
16
19
  import 'string-length';
17
20
  import 'strip-ansi';
18
21
  import 'luxon';
19
- import 'uuid';
20
22
  import 'fast-glob';
21
- import 'fs';
22
- import 'yazl';
23
23
  import 'socket.io-client';
24
24
  import '../../useAndroidServiceAccountTestResult-Ce1x0Eh8.js';
25
25
  import 'marked';
@@ -1,35 +1,36 @@
1
1
  import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
2
2
  import { Args } from '@oclif/core';
3
- import { Text, Box, render } from 'ink';
3
+ import { Text, Box, useInput, render } from 'ink';
4
4
  import { p as getAuthedHeaders, q as API_URL, K as castArrayObjectDates, $ as queryClient, a8 as updateProject, u as getGodotVersion, t as GameEngine, v as createProject, w as DEFAULT_IGNORED_FILES_GLOBS, x as DEFAULT_SHIPPED_FILES_GLOBS, P as Platform, J as JobStatus, X as WEB_URL, H as getProject, C as CredentialsType, Q as getGoogleStatus, B as BaseAuthenticatedCommand, j as isCWDGodotGame } from '../../index-BB7X1Pqp.js';
5
5
  import React, { useState, useContext, useEffect, useRef } from 'react';
6
- import { c as CommandContext, b as GameContext, d as useBuilds, M as Markdown, q as queryBuilds, G as GameProvider, e as CreateGooglePlayGame, C as Command } from '../../Command-D6rWEZRM.js';
6
+ import { c as CommandContext, b as GameContext, M as Markdown, d as useBuilds, q as queryBuilds, G as GameProvider, e as CreateGooglePlayGame, C as Command } from '../../Command-BiB9MqbJ.js';
7
7
  import Spinner from 'ink-spinner';
8
8
  import { Alert, TextInput } from '@inkjs/ui';
9
9
  import axios from 'axios';
10
10
  import 'crypto-js';
11
11
  import 'uuid';
12
12
  import 'luxon';
13
- import 'fs';
13
+ import fs__default from 'fs';
14
14
  import { useQuery, useMutation } from '@tanstack/react-query';
15
- import 'open';
15
+ import 'yazl';
16
16
  import 'crypto';
17
17
  import 'readline-sync';
18
18
  import 'node:readline';
19
19
  import 'node:path';
20
20
  import 'node:url';
21
21
  import 'fast-glob';
22
- import 'yazl';
23
22
  import 'socket.io-client';
24
23
  import 'isomorphic-git';
24
+ import 'open';
25
25
  import 'qrcode';
26
26
  import 'string-length';
27
27
  import 'strip-ansi';
28
- import { C as CreateKeystore } from '../../CreateKeystore-g1z6DsU5.js';
29
- import { C as ConnectGoogle } from '../../index-DgbQBx6x.js';
30
- import { C as CreateServiceAccountKey } from '../../index-m4HTrJ5J.js';
28
+ import { C as CreateKeystore } from '../../Create-DIaSKUpl.js';
29
+ import { I as ImportKeystore } from '../../Import-BIOsf8AA.js';
30
+ import { C as ConnectGoogle } from '../../index-o9Y-84Rj.js';
31
+ import { C as CreateServiceAccountKey } from '../../index-D6BH5UAM.js';
31
32
  import { c as cacheKeys, f as fetchKeyTestResult, K as KeyTestStatus, a as KeyTestError } from '../../useAndroidServiceAccountTestResult-Ce1x0Eh8.js';
32
- import { u as useShip, J as JobProgress } from '../../JobProgress-jmGAzvxS.js';
33
+ import { u as useShip, J as JobProgress } from '../../JobProgress-W0QQR49T.js';
33
34
  import { a as getProjectCredentials } from '../../index-DOgF4dFK.js';
34
35
  import { T as Title } from '../../Title-BCQtayg6.js';
35
36
  import 'path';
@@ -40,11 +41,12 @@ import '../../index-Cz_KLwWf.js';
40
41
  import 'marked';
41
42
  import 'marked-terminal';
42
43
  import '../../RunWithSpinner-BVXNWGD3.js';
44
+ import '../../import-v54PM_Qg.js';
43
45
  import '../../useWebSocket-CBqsjHbt.js';
44
46
  import '../../useProjectCredentials-vjedBbKl.js';
45
47
  import '../../ProgressSpinner-6pw1T8Iw.js';
46
48
  import '../../git-DREGq-jc.js';
47
- import '../../useJobWatching-D-YzSlK8.js';
49
+ import '../../useJobWatching-I_A3b36f.js';
48
50
 
49
51
  async function queryJobs({ projectId, ...pageAndSortParams }) {
50
52
  try {
@@ -230,6 +232,103 @@ const FormTextInput = ({ label, labelProps, ...rest }) => /* @__PURE__ */ jsxs(B
230
232
  /* @__PURE__ */ jsx(TextInput, { ...rest })
231
233
  ] });
232
234
 
235
+ const ImportForm = ({ importKeystoreProps, onSubmit }) => {
236
+ const [activeInput, setActiveInput] = useState("jksFilePath" /* jksFilePath */);
237
+ const [error, setError] = useState(null);
238
+ const [jksFilePath, setJksFilePath] = useState(importKeystoreProps.jksFilePath);
239
+ const [password, setPassword] = useState(importKeystoreProps.keyPassword);
240
+ const handleSubmitJksFilePath = () => {
241
+ setError(null);
242
+ if (!jksFilePath || jksFilePath.length === 0) {
243
+ setError("Please enter a path to your jks file");
244
+ return;
245
+ }
246
+ if (!fs__default.existsSync(jksFilePath)) {
247
+ setError("The file does not exist");
248
+ return;
249
+ }
250
+ setActiveInput("password" /* password */);
251
+ };
252
+ const handleSubmitPassword = () => {
253
+ setError(null);
254
+ if (!password || password.length === 0) {
255
+ setError("Please enter a password");
256
+ return;
257
+ }
258
+ onSubmit({
259
+ ...importKeystoreProps,
260
+ jksFilePath,
261
+ keyPassword: password,
262
+ keystorePassword: password
263
+ });
264
+ };
265
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
266
+ error && /* @__PURE__ */ jsx(Alert, { variant: "error", children: error }),
267
+ /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginLeft: 1, children: [
268
+ /* @__PURE__ */ jsx(
269
+ FormTextInput,
270
+ {
271
+ label: "Path to your jks file:",
272
+ isDisabled: activeInput !== "jksFilePath" /* jksFilePath */,
273
+ defaultValue: jksFilePath,
274
+ placeholder: "Enter the path to your jks file...",
275
+ onChange: setJksFilePath,
276
+ onSubmit: handleSubmitJksFilePath
277
+ }
278
+ ),
279
+ /* @__PURE__ */ jsx(
280
+ FormTextInput,
281
+ {
282
+ label: "Password:",
283
+ isDisabled: activeInput !== "password" /* password */,
284
+ defaultValue: password,
285
+ placeholder: "Enter the password for your jks file...",
286
+ onChange: setPassword,
287
+ onSubmit: handleSubmitPassword
288
+ }
289
+ )
290
+ ] })
291
+ ] });
292
+ };
293
+
294
+ const CreateOrImport = ({ onComplete, onError, ...boxProps }) => {
295
+ const [stage, setStage] = useState(0 /* Choose */);
296
+ const [importKeystoreProps, setImportKeystoreProps] = useState({
297
+ jksFilePath: "",
298
+ keyPassword: "",
299
+ keystorePassword: ""
300
+ });
301
+ useInput(async (input) => {
302
+ if (stage !== 0 /* Choose */) return;
303
+ if (input === "c") return setStage(1 /* Create */);
304
+ if (input === "i") return setStage(2 /* ImportForm */);
305
+ });
306
+ const handleImportFormSubmit = (newImportProps) => {
307
+ setImportKeystoreProps(newImportProps);
308
+ setStage(3 /* ImportKeystore */);
309
+ };
310
+ const renderStage = () => {
311
+ switch (stage) {
312
+ case 0 /* Choose */:
313
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
314
+ /* @__PURE__ */ jsx(Text, { children: "Would you like to create a new keystore or import an existing one?" }),
315
+ /* @__PURE__ */ jsx(Text, { bold: true, children: "Press C to create a new keystore" }),
316
+ /* @__PURE__ */ jsx(Text, { bold: true, children: "Press I to import an existing keystore" })
317
+ ] });
318
+ case 1 /* Create */:
319
+ return /* @__PURE__ */ jsx(CreateKeystore, { onComplete, onError });
320
+ case 2 /* ImportForm */:
321
+ return /* @__PURE__ */ jsx(ImportForm, { onSubmit: handleImportFormSubmit, importKeystoreProps });
322
+ case 3 /* ImportKeystore */:
323
+ return /* @__PURE__ */ jsx(ImportKeystore, { onComplete, onError, importKeystoreProps });
324
+ }
325
+ };
326
+ return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", gap: 1, ...boxProps, children: [
327
+ /* @__PURE__ */ jsx(Markdown, { filename: "create-or-import-keystore.md", templateVars: {} }),
328
+ renderStage()
329
+ ] });
330
+ };
331
+
233
332
  const CreateInitialBuild = (props) => {
234
333
  const { gameId } = useContext(GameContext);
235
334
  return /* @__PURE__ */ jsx(Fragment, { children: gameId && /* @__PURE__ */ jsx(CreateForGame, { gameId, ...props }) });
@@ -252,8 +351,10 @@ const CreateForGame = ({ onComplete, onError, gameId, ...boxProps }) => {
252
351
  const hasAndroidBuild = buildData.data.some((build) => build.platform === Platform.ANDROID);
253
352
  if (!prevHasBuild.current && hasAndroidBuild) return onComplete();
254
353
  prevHasBuild.current = hasAndroidBuild;
255
- const hasAndroidJob = jobData.data.some((job) => job.type === Platform.ANDROID);
256
- const shouldRun = !hasAndroidBuild && !hasAndroidJob;
354
+ const hasRunningAndroidJob = jobData.data.some(
355
+ (job) => job.type === Platform.ANDROID && [JobStatus.PENDING, JobStatus.PROCESSING].includes(job.status)
356
+ );
357
+ const shouldRun = !hasAndroidBuild && !hasRunningAndroidJob;
257
358
  if (shouldRun)
258
359
  shipMutation.mutateAsync({
259
360
  command,
@@ -357,9 +458,7 @@ const getStepInitialStatus = (step, statusFlags) => {
357
458
  createKeystore: statusFlags.hasAndroidKeystore,
358
459
  createServiceAccount: statusFlags.hasServiceAccountKey,
359
460
  createGooglePlayGame: statusFlags.hasGooglePlayGame,
360
- inviteServiceAccount: statusFlags.hasInvitedServiceAccount,
361
- connectGoogle: false,
362
- createInitialBuild: false
461
+ inviteServiceAccount: statusFlags.hasInvitedServiceAccount
363
462
  };
364
463
  return base[step] ? "SUCCESS" /* SUCCESS */ : "PENDING" /* PENDING */;
365
464
  };
@@ -399,7 +498,7 @@ const getStatusFlags = async (cmd) => {
399
498
 
400
499
  const StepLabels = {
401
500
  createGame: "Create game in ShipThis",
402
- createKeystore: "Create an Android Keystore",
501
+ createKeystore: "Create or import an Android Keystore",
403
502
  connectGoogle: "Connect ShipThis with Google",
404
503
  createServiceAccount: "Create a Service Account & API Key",
405
504
  createInitialBuild: "Create an initial build",
@@ -438,7 +537,7 @@ const StepStatusTable = ({ stepStatuses }) => {
438
537
 
439
538
  const stepComponentMap = {
440
539
  createGame: CreateGame,
441
- createKeystore: CreateKeystore,
540
+ createKeystore: CreateOrImport,
442
541
  connectGoogle: ConnectGoogle,
443
542
  createServiceAccount: CreateServiceAccountKey,
444
543
  createInitialBuild: CreateInitialBuild,
@@ -2,7 +2,7 @@ import { jsxs, jsx } from 'react/jsx-runtime';
2
2
  import { render } from 'ink';
3
3
  import { T as BaseCommand, j as isCWDGodotGame } from '../index-BB7X1Pqp.js';
4
4
  import 'react';
5
- import { C as Command } from '../Command-D6rWEZRM.js';
5
+ import { C as Command } from '../Command-BiB9MqbJ.js';
6
6
  import 'ink-spinner';
7
7
  import 'axios';
8
8
  import 'crypto-js';
@@ -11,17 +11,17 @@ import 'luxon';
11
11
  import 'fs';
12
12
  import '@inkjs/ui';
13
13
  import '@tanstack/react-query';
14
- import 'open';
14
+ import 'yazl';
15
15
  import 'crypto';
16
16
  import 'readline-sync';
17
17
  import 'node:readline';
18
18
  import 'node:path';
19
19
  import 'node:url';
20
20
  import 'fast-glob';
21
- import 'yazl';
22
21
  import 'socket.io-client';
23
22
  import { i as isCWDGitRepo } from '../git-DREGq-jc.js';
24
23
  import '@oclif/core';
24
+ import 'open';
25
25
  import { N as NextSteps } from '../NextSteps-CK9zHOCt.js';
26
26
  import 'qrcode';
27
27
  import { S as StatusTable } from '../StatusTable-Dm5St4g-.js';
@@ -12,7 +12,12 @@ async function getNewImportTicket(projectId) {
12
12
  });
13
13
  return importInfo;
14
14
  }
15
- async function importCredential({ projectId, zipPath, type, platform }) {
15
+ async function importCredential({
16
+ projectId,
17
+ zipPath,
18
+ type,
19
+ platform
20
+ }) {
16
21
  const importTicket = await getNewImportTicket(projectId);
17
22
  const zipBuffer = await promises.readFile(zipPath);
18
23
  await axios.put(importTicket.url, zipBuffer, {
@@ -23,7 +28,7 @@ async function importCredential({ projectId, zipPath, type, platform }) {
23
28
  });
24
29
  const headers = getAuthedHeaders();
25
30
  const url = projectId ? `${API_URL}/projects/${projectId}/credentials/import` : `${API_URL}/credentials/import`;
26
- return await axios({
31
+ const { data: publicCredential } = await axios({
27
32
  method: "post",
28
33
  url,
29
34
  headers,
@@ -33,6 +38,10 @@ async function importCredential({ projectId, zipPath, type, platform }) {
33
38
  platform
34
39
  }
35
40
  });
41
+ if (projectId) {
42
+ return publicCredential;
43
+ }
44
+ return publicCredential;
36
45
  }
37
46
 
38
47
  export { importCredential as i };
@@ -2,7 +2,7 @@ import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
2
2
  import { Box, Text } from 'ink';
3
3
  import { useState, useRef, useEffect, useContext } from 'react';
4
4
  import Spinner from 'ink-spinner';
5
- import { b as GameContext } from './Command-D6rWEZRM.js';
5
+ import { b as GameContext } from './Command-BiB9MqbJ.js';
6
6
  import { p as getAuthedHeaders, q as API_URL, F as castObjectDates, P as Platform, C as CredentialsType, Q as getGoogleStatus } from './index-BB7X1Pqp.js';
7
7
  import axios from 'axios';
8
8
  import 'crypto-js';
@@ -11,7 +11,7 @@ import 'luxon';
11
11
  import 'fs';
12
12
  import '@inkjs/ui';
13
13
  import { useQuery, useQueryClient } from '@tanstack/react-query';
14
- import 'open';
14
+ import 'yazl';
15
15
  import 'crypto';
16
16
  import 'readline-sync';
17
17
  import 'node:readline';
@@ -19,12 +19,12 @@ import 'node:path';
19
19
  import 'node:url';
20
20
  import { c as cacheKeys } from './useAndroidServiceAccountTestResult-Ce1x0Eh8.js';
21
21
  import 'fast-glob';
22
- import 'yazl';
23
22
  import 'socket.io-client';
24
23
  import 'isomorphic-git';
25
24
  import '@oclif/core';
26
25
  import { u as useWebSocket } from './useWebSocket-CBqsjHbt.js';
27
26
  import { u as useProjectCredentials } from './useProjectCredentials-vjedBbKl.js';
27
+ import 'open';
28
28
  import { P as ProgressSpinner } from './ProgressSpinner-6pw1T8Iw.js';
29
29
  import 'qrcode';
30
30
  import 'string-length';
@@ -21,7 +21,7 @@ import { u as useWebSocket } from './useWebSocket-CBqsjHbt.js';
21
21
  import { c as cacheKeys } from './useAndroidServiceAccountTestResult-Ce1x0Eh8.js';
22
22
  import 'isomorphic-git';
23
23
  import '@oclif/core';
24
- import { b as GameContext, M as Markdown } from './Command-D6rWEZRM.js';
24
+ import { b as GameContext, M as Markdown } from './Command-BiB9MqbJ.js';
25
25
  import 'ink-spinner';
26
26
  import '@inkjs/ui';
27
27
  import 'string-length';
@@ -1,4 +1,4 @@
1
- import { u as useJob } from './Command-D6rWEZRM.js';
1
+ import { u as useJob } from './Command-BiB9MqbJ.js';
2
2
  import { useState, useEffect } from 'react';
3
3
  import { u as useWebSocket } from './useWebSocket-CBqsjHbt.js';
4
4
  import { E as castJobDates, F as castObjectDates } from './index-BB7X1Pqp.js';
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "shipthis",
3
- "version": "0.1.10",
3
+ "version": "0.1.12",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "shipthis",
9
- "version": "0.1.10",
9
+ "version": "0.1.12",
10
10
  "license": "MIT",
11
11
  "dependencies": {
12
12
  "@expo/apple-utils": "2.0.3",
@@ -1028,88 +1028,6 @@
1028
1028
  "status.js"
1029
1029
  ]
1030
1030
  },
1031
- "game:android:wizard": {
1032
- "aliases": [],
1033
- "args": {},
1034
- "description": "Prototype Android Wizard",
1035
- "examples": [
1036
- "<%= config.bin %> <%= command.id %>"
1037
- ],
1038
- "flags": {
1039
- "name": {
1040
- "char": "n",
1041
- "description": "The name of the game",
1042
- "name": "name",
1043
- "hasDynamicHelp": false,
1044
- "multiple": false,
1045
- "type": "option"
1046
- },
1047
- "buildNumber": {
1048
- "char": "b",
1049
- "description": "Set the build number",
1050
- "name": "buildNumber",
1051
- "hasDynamicHelp": false,
1052
- "multiple": false,
1053
- "type": "option"
1054
- },
1055
- "semanticVersion": {
1056
- "char": "s",
1057
- "description": "Set the semantic version",
1058
- "name": "semanticVersion",
1059
- "hasDynamicHelp": false,
1060
- "multiple": false,
1061
- "type": "option"
1062
- },
1063
- "gameEngine": {
1064
- "char": "e",
1065
- "description": "Set the game engine",
1066
- "name": "gameEngine",
1067
- "hasDynamicHelp": false,
1068
- "multiple": false,
1069
- "type": "option"
1070
- },
1071
- "gameEngineVersion": {
1072
- "char": "v",
1073
- "description": "Set the game engine version",
1074
- "name": "gameEngineVersion",
1075
- "hasDynamicHelp": false,
1076
- "multiple": false,
1077
- "type": "option"
1078
- },
1079
- "iosBundleId": {
1080
- "char": "i",
1081
- "description": "Set the iOS bundle ID",
1082
- "name": "iosBundleId",
1083
- "hasDynamicHelp": false,
1084
- "multiple": false,
1085
- "type": "option"
1086
- },
1087
- "androidPackageName": {
1088
- "char": "a",
1089
- "description": "Set the Android package name",
1090
- "name": "androidPackageName",
1091
- "hasDynamicHelp": false,
1092
- "multiple": false,
1093
- "type": "option"
1094
- }
1095
- },
1096
- "hasDynamicHelp": false,
1097
- "hiddenAliases": [],
1098
- "id": "game:android:wizard",
1099
- "pluginAlias": "shipthis",
1100
- "pluginName": "shipthis",
1101
- "pluginType": "core",
1102
- "strict": true,
1103
- "enableJsonFlag": false,
1104
- "isESM": true,
1105
- "relativePath": [
1106
- "dist",
1107
- "commands",
1108
- "game",
1109
- "android",
1110
- "wizard.js"
1111
- ]
1112
- },
1113
1031
  "game:build:download": {
1114
1032
  "aliases": [],
1115
1033
  "args": {
@@ -1827,14 +1745,15 @@
1827
1745
  "aliases": [],
1828
1746
  "args": {
1829
1747
  "file": {
1830
- "description": "Name of the ZIP file to import (must be in the same format as the export)",
1748
+ "description": "Path to the ZIP file to import (must be in the same format as the export)",
1831
1749
  "name": "file",
1832
- "required": true
1750
+ "required": false
1833
1751
  }
1834
1752
  },
1835
1753
  "description": "Imports an Android Keystore to your ShipThis account for the specified game.",
1836
1754
  "examples": [
1837
- "<%= config.bin %> <%= command.id %>"
1755
+ "<%= config.bin %> <%= command.id %> path/to/import.zip -g abfd5b00",
1756
+ "<%= config.bin %> <%= command.id %> --jksFile path/to/file.jks --keystorePassword yourpass --keyPassword yourkeypass"
1838
1757
  ],
1839
1758
  "flags": {
1840
1759
  "gameId": {
@@ -1845,8 +1764,30 @@
1845
1764
  "multiple": false,
1846
1765
  "type": "option"
1847
1766
  },
1767
+ "jksFile": {
1768
+ "description": "Path to the JKS file to import (requires passwords)",
1769
+ "name": "jksFile",
1770
+ "hasDynamicHelp": false,
1771
+ "multiple": false,
1772
+ "type": "option"
1773
+ },
1774
+ "keystorePassword": {
1775
+ "description": "Keystore password (required when using --jksFile)",
1776
+ "name": "keystorePassword",
1777
+ "hasDynamicHelp": false,
1778
+ "multiple": false,
1779
+ "type": "option"
1780
+ },
1781
+ "keyPassword": {
1782
+ "description": "Key alias password (required when using --jksFile)",
1783
+ "name": "keyPassword",
1784
+ "hasDynamicHelp": false,
1785
+ "multiple": false,
1786
+ "type": "option"
1787
+ },
1848
1788
  "force": {
1849
1789
  "char": "f",
1790
+ "description": "Overwrite any existing keystore without confirmation",
1850
1791
  "name": "force",
1851
1792
  "allowNo": false,
1852
1793
  "type": "boolean"
@@ -2297,5 +2238,5 @@
2297
2238
  ]
2298
2239
  }
2299
2240
  },
2300
- "version": "0.1.10"
2241
+ "version": "0.1.12"
2301
2242
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "shipthis",
3
3
  "description": "ShipThis manages building and uploading your Godot games to the App Store and Google Play.",
4
- "version": "0.1.10",
4
+ "version": "0.1.12",
5
5
  "author": "Hello Invent Ltd",
6
6
  "bin": {
7
7
  "shipthis": "./bin/run.js"