shipthis 0.1.32 → 0.1.33

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 (76) hide show
  1. package/dist/{AppleBundleIdDetails-6H3cNWxw.js → AppleBundleIdDetails-BhHPCvRm.js} +4 -4
  2. package/dist/{Command-WPpmLPkL.js → Command-BDIkuv2g.js} +2 -2
  3. package/dist/{CommandGame-cxzWG4nT.js → CommandGame-CvBIjPZp.js} +2 -2
  4. package/dist/{Create-3Ob8sjik.js → Create-Lpe0B8nT.js} +3 -3
  5. package/dist/{GameStatus-BQEtVKvv.js → GameStatus-5XpufIY_.js} +3 -3
  6. package/dist/{Import-CFuPDI0K.js → Import-DFzrAG04.js} +6 -6
  7. package/dist/{JobLogTail-0CBLoG8N.js → JobLogTail-BYcJgPcL.js} +5 -5
  8. package/dist/{JobProgress-lKqVT88m.js → JobProgress-BcrE7CUK.js} +11 -8
  9. package/dist/{JobStatusTable-C_ZsZJCm.js → JobStatusTable-Bi-y8ZZT.js} +4 -4
  10. package/dist/{ProgressSpinner-DGcakQSK.js → ProgressSpinner-Um6ARKlk.js} +1 -1
  11. package/dist/{ProjectCredentialsTable-B5pHOnGu.js → ProjectCredentialsTable-B4vDJl4l.js} +2 -2
  12. package/dist/{UserCredentialsTable-3W3qesh7.js → UserCredentialsTable-CwkZTFBD.js} +3 -3
  13. package/dist/{baseAppleCommand-BGV088--.js → baseAppleCommand-BKXweb-U.js} +1 -1
  14. package/dist/{baseGameAndroidCommand-CsemgVjp.js → baseGameAndroidCommand-CAi-BSsH.js} +2 -2
  15. package/dist/commands/apple/apiKey/create.js +9 -9
  16. package/dist/commands/apple/apiKey/export.js +8 -8
  17. package/dist/commands/apple/apiKey/import.js +8 -8
  18. package/dist/commands/apple/apiKey/status.js +7 -7
  19. package/dist/commands/apple/certificate/create.js +9 -9
  20. package/dist/commands/apple/certificate/export.js +8 -8
  21. package/dist/commands/apple/certificate/import.js +8 -8
  22. package/dist/commands/apple/certificate/status.js +8 -8
  23. package/dist/commands/apple/login.js +3 -2
  24. package/dist/commands/apple/status.js +5 -5
  25. package/dist/commands/dashboard.js +2 -1
  26. package/dist/commands/game/android/apiKey/connect.js +9 -9
  27. package/dist/commands/game/android/apiKey/create.js +13 -13
  28. package/dist/commands/game/android/apiKey/export.js +9 -9
  29. package/dist/commands/game/android/apiKey/import.js +9 -9
  30. package/dist/commands/game/android/apiKey/invite.js +5 -4
  31. package/dist/commands/game/android/apiKey/status.js +9 -9
  32. package/dist/commands/game/android/keyStore/create.js +10 -10
  33. package/dist/commands/game/android/keyStore/export.js +8 -8
  34. package/dist/commands/game/android/keyStore/import.js +11 -11
  35. package/dist/commands/game/android/keyStore/status.js +7 -7
  36. package/dist/commands/game/android/status.js +2 -1
  37. package/dist/commands/game/build/download.js +5 -5
  38. package/dist/commands/game/build/list.js +6 -6
  39. package/dist/commands/game/create.js +3 -2
  40. package/dist/commands/game/details.js +5 -5
  41. package/dist/commands/game/export.js +2 -1
  42. package/dist/commands/game/ios/app/addTester.js +19 -14
  43. package/dist/commands/game/ios/app/create.js +5 -5
  44. package/dist/commands/game/ios/app/status.js +8 -8
  45. package/dist/commands/game/ios/app/sync.js +6 -6
  46. package/dist/commands/game/ios/profile/create.js +10 -10
  47. package/dist/commands/game/ios/profile/export.js +8 -8
  48. package/dist/commands/game/ios/profile/import.js +8 -8
  49. package/dist/commands/game/ios/profile/status.js +7 -7
  50. package/dist/commands/game/ios/status.js +10 -10
  51. package/dist/commands/game/ios/wizard.js +13 -8
  52. package/dist/commands/game/job/list.js +5 -5
  53. package/dist/commands/game/job/status.js +9 -9
  54. package/dist/commands/game/list.js +6 -6
  55. package/dist/commands/game/ship.js +19 -17
  56. package/dist/commands/game/status.js +7 -7
  57. package/dist/commands/game/wizard.js +21 -21
  58. package/dist/commands/internal/fastlane.js +2 -1
  59. package/dist/commands/internal/readme.js +2 -1
  60. package/dist/commands/login.js +3 -2
  61. package/dist/commands/status.js +5 -5
  62. package/dist/{export-CXsVPXA1.js → export-DLQrUEBK.js} +1 -1
  63. package/dist/{import-DGvG5REx.js → import-BoY5e0uJ.js} +1 -1
  64. package/dist/{index-CGBdOm1q.js → index-B27WJDxn.js} +2 -1
  65. package/dist/{index-CS9Gwcb0.js → index-CisLwc7e.js} +7 -7
  66. package/dist/{index-CtTI85m-.js → index-Crv7S0bl.js} +1 -1
  67. package/dist/{index-C03TV1_J.js → index-DC0GJtAy.js} +17 -9
  68. package/dist/{index-C66Dd8Xc.js → index-DfUg5j06.js} +23 -12
  69. package/dist/{index-BhhiXbey.js → index-pj8JVg5X.js} +4 -3
  70. package/dist/{upload-8y5MQEm9.js → upload-C8S17EU_.js} +1 -1
  71. package/dist/{useAndroidServiceAccountTestResult-DZk5SMxI.js → useAndroidServiceAccountTestResult-D4e5AKAZ.js} +1 -1
  72. package/dist/{useAppleApp-DWYGURwU.js → useAppleApp-Dr6URQvC.js} +1 -1
  73. package/dist/{useAppleBundleId-PsTJ2g1B.js → useAppleBundleId-DELAwSQp.js} +1 -1
  74. package/dist/{useProjectCredentials-BEphqa18.js → useProjectCredentials-BjvdJdQg.js} +3 -3
  75. package/dist/{useWebSocket-5PYa2QER.js → useWebSocket-CRV7V69Q.js} +1 -1
  76. package/package.json +2 -2
@@ -1,9 +1,9 @@
1
1
  import { jsxs, jsx } from 'react/jsx-runtime';
2
2
  import { Flags } from '@oclif/core';
3
3
  import { render, Box, Text } from 'ink';
4
- import { B as BaseAuthenticatedCommand, g as getProjects, b as getShortDate } from '../../index-BhhiXbey.js';
4
+ import { B as BaseAuthenticatedCommand, g as getProjects, b as getShortDate } from '../../index-pj8JVg5X.js';
5
5
  import 'ink-spinner';
6
- import { g as getShortUUID } from '../../index-CGBdOm1q.js';
6
+ import { g as getShortUUID } from '../../index-B27WJDxn.js';
7
7
  import { T as Table } from '../../Table-FaNgpyeq.js';
8
8
  import 'react';
9
9
  import '@tanstack/react-query';
@@ -23,8 +23,8 @@ import 'node:path';
23
23
  import 'marked';
24
24
  import 'marked-terminal';
25
25
  import 'qrcode';
26
- import '../../index-C66Dd8Xc.js';
27
- import { C as Command } from '../../Command-WPpmLPkL.js';
26
+ import '../../index-DfUg5j06.js';
27
+ import { C as Command } from '../../Command-BDIkuv2g.js';
28
28
  import 'crypto-js';
29
29
  import '@expo/apple-utils/build/index.js';
30
30
  import 'node:crypto';
@@ -34,7 +34,7 @@ import 'readline-sync';
34
34
  import 'isomorphic-git';
35
35
  import 'deepmerge';
36
36
  import 'ini';
37
- import '../../useAndroidServiceAccountTestResult-DZk5SMxI.js';
37
+ import '../../useAndroidServiceAccountTestResult-D4e5AKAZ.js';
38
38
 
39
39
  class GameList extends BaseAuthenticatedCommand {
40
40
  static args = {};
@@ -67,7 +67,7 @@ class GameList extends BaseAuthenticatedCommand {
67
67
  }));
68
68
  render(
69
69
  /* @__PURE__ */ jsxs(Command, { command: this, children: [
70
- data.length === 0 && params.pageNumber == 0 && /* @__PURE__ */ jsxs(Box, { flexDirection: "column", children: [
70
+ data.length === 0 && params.pageNumber === 0 && /* @__PURE__ */ jsxs(Box, { flexDirection: "column", children: [
71
71
  /* @__PURE__ */ jsx(Text, { children: "No games found. Create one now with:" }),
72
72
  /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginLeft: 2, marginTop: 1, children: [
73
73
  /* @__PURE__ */ jsx(Text, { children: "shipthis game wizard android" }),
@@ -1,7 +1,7 @@
1
1
  import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
2
2
  import { Flags } from '@oclif/core';
3
- import { useInput, Box, Text, render } from 'ink';
4
- import { M as LogLevel, a2 as getShortAuthRequiredUrl, W as WEB_URL, c as BaseGameCommand, z as getJob, H as downloadBuildById } from '../../index-BhhiXbey.js';
3
+ import { Box, Text, render } from 'ink';
4
+ import { M as LogLevel, W as WEB_URL, a2 as getShortAuthRequiredUrl, c as BaseGameCommand, z as getJob, H as downloadBuildById } from '../../index-pj8JVg5X.js';
5
5
  import 'ink-spinner';
6
6
  import 'node:crypto';
7
7
  import 'node:fs';
@@ -22,27 +22,27 @@ import 'fullscreen-ink';
22
22
  import 'string-length';
23
23
  import 'strip-ansi';
24
24
  import open from 'open';
25
- import { g as getShortUUID } from '../../index-CGBdOm1q.js';
25
+ import { g as getShortUUID } from '../../index-B27WJDxn.js';
26
26
  import 'crypto-js';
27
- import { u as useJobWatching, J as JobLogTail } from '../../JobLogTail-0CBLoG8N.js';
28
- import { J as JobStatusTable } from '../../JobStatusTable-C_ZsZJCm.js';
27
+ import { u as useJobWatching, J as JobLogTail } from '../../JobLogTail-BYcJgPcL.js';
28
+ import { J as JobStatusTable } from '../../JobStatusTable-Bi-y8ZZT.js';
29
29
  import '@inkjs/ui';
30
- import { u as useShip, J as JobProgress } from '../../JobProgress-lKqVT88m.js';
31
- import { C as CommandContext, G as GameContext, M as Markdown } from '../../index-C66Dd8Xc.js';
30
+ import { u as useShip, J as JobProgress } from '../../JobProgress-BcrE7CUK.js';
31
+ import { C as CommandContext, G as GameContext, e as useSafeInput, M as Markdown } from '../../index-DfUg5j06.js';
32
32
  import 'qrcode';
33
33
  import 'marked';
34
34
  import 'marked-terminal';
35
- import { C as CommandGame } from '../../CommandGame-cxzWG4nT.js';
35
+ import { C as CommandGame } from '../../CommandGame-CvBIjPZp.js';
36
36
  import '@expo/apple-utils/build/index.js';
37
37
  import 'deepmerge';
38
38
  import 'ini';
39
- import '../../useAndroidServiceAccountTestResult-DZk5SMxI.js';
40
- import '../../useWebSocket-5PYa2QER.js';
39
+ import '../../useAndroidServiceAccountTestResult-D4e5AKAZ.js';
40
+ import '../../useWebSocket-CRV7V69Q.js';
41
41
  import '../../Title-BCQtayg6.js';
42
42
  import '../../StatusTable-DzRWcMr4.js';
43
43
  import '../../git-BpsfNFZ_.js';
44
- import '../../ProgressSpinner-DGcakQSK.js';
45
- import '../../Command-WPpmLPkL.js';
44
+ import '../../ProgressSpinner-Um6ARKlk.js';
45
+ import '../../Command-BDIkuv2g.js';
46
46
 
47
47
  function isNetworkError(exception) {
48
48
  if (!axios.isAxiosError(exception)) return false;
@@ -73,7 +73,7 @@ const JobFollow = ({ jobId, onComplete, onFailure, projectId }) => {
73
73
  onComplete,
74
74
  onFailure,
75
75
  onNewLogEntry(logEntry) {
76
- if (logEntry.level == LogLevel.ERROR) console.error(logEntry.message);
76
+ if (logEntry.level === LogLevel.ERROR) console.error(logEntry.message);
77
77
  else console.log(logEntry.message);
78
78
  },
79
79
  projectId
@@ -94,15 +94,17 @@ const Ship = ({ onComplete, onError }) => {
94
94
  const [isComplete, setIsComplete] = useState(false);
95
95
  const handleStartOnMount = async () => {
96
96
  if (!command) throw new Error("No command in context");
97
- const startedJobs = await shipMutation.mutateAsync({ command, log: setShipLog });
97
+ const logFn = flags?.follow ? console.log : setShipLog;
98
+ const startedJobs = await shipMutation.mutateAsync({ command, log: logFn });
98
99
  setJobs(startedJobs);
99
100
  };
100
101
  useEffect(() => {
101
102
  handleStartOnMount().catch(onError);
102
103
  }, []);
103
- useInput(async (input) => {
104
+ useSafeInput(async (input) => {
104
105
  if (!gameId) return;
105
- switch (input) {
106
+ const i = input.toLowerCase();
107
+ switch (i) {
106
108
  case "l": {
107
109
  setShowLog((prev) => !prev);
108
110
  break;
@@ -141,7 +143,7 @@ const Ship = ({ onComplete, onError }) => {
141
143
  return /* @__PURE__ */ jsx(Fragment, {});
142
144
  }
143
145
  return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", children: [
144
- jobs == null && /* @__PURE__ */ jsx(Text, { children: shipLog }),
146
+ jobs === null && /* @__PURE__ */ jsx(Text, { children: shipLog }),
145
147
  jobs && jobs.map((job) => /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [
146
148
  /* @__PURE__ */ jsx(JobStatusTable, { isWatching: true, jobId: job.id, projectId: job.project.id }),
147
149
  /* @__PURE__ */ jsx(Box, { flexDirection: "column", children: /* @__PURE__ */ jsx(JobProgress, { job, onComplete: handleJobComplete, onFailure: handleJobFailure }) }),
@@ -1,7 +1,7 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
2
  import { Flags } from '@oclif/core';
3
3
  import { render } from 'ink';
4
- import { B as BaseAuthenticatedCommand } from '../../index-BhhiXbey.js';
4
+ import { B as BaseAuthenticatedCommand } from '../../index-pj8JVg5X.js';
5
5
  import 'ink-spinner';
6
6
  import 'node:crypto';
7
7
  import 'node:fs';
@@ -20,7 +20,7 @@ import 'fast-glob';
20
20
  import 'yazl';
21
21
  import 'socket.io-client';
22
22
  import 'fullscreen-ink';
23
- import { a as GameStatus$1 } from '../../GameStatus-BQEtVKvv.js';
23
+ import { a as GameStatus$1 } from '../../GameStatus-5XpufIY_.js';
24
24
  import 'string-length';
25
25
  import 'strip-ansi';
26
26
  import 'open';
@@ -28,17 +28,17 @@ import '@inkjs/ui';
28
28
  import 'marked';
29
29
  import 'marked-terminal';
30
30
  import 'qrcode';
31
- import '../../index-C66Dd8Xc.js';
32
- import { C as CommandGame } from '../../CommandGame-cxzWG4nT.js';
31
+ import '../../index-DfUg5j06.js';
32
+ import { C as CommandGame } from '../../CommandGame-CvBIjPZp.js';
33
33
  import '@expo/apple-utils/build/index.js';
34
34
  import 'deepmerge';
35
35
  import 'ini';
36
- import '../../index-CGBdOm1q.js';
36
+ import '../../index-B27WJDxn.js';
37
37
  import '../../StatusTable-DzRWcMr4.js';
38
38
  import '../../Title-BCQtayg6.js';
39
39
  import '../../NextSteps-DbJHmscQ.js';
40
- import '../../useAndroidServiceAccountTestResult-DZk5SMxI.js';
41
- import '../../Command-WPpmLPkL.js';
40
+ import '../../useAndroidServiceAccountTestResult-D4e5AKAZ.js';
41
+ import '../../Command-BDIkuv2g.js';
42
42
 
43
43
  class GameStatus extends BaseAuthenticatedCommand {
44
44
  static args = {};
@@ -1,8 +1,8 @@
1
1
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
2
  import { Args } from '@oclif/core';
3
3
  import { useScreenSize, withFullScreen } from 'fullscreen-ink';
4
- import { K as queryClient, p as getAuthedHeaders, o as API_URL, I as castArrayObjectDates, a9 as updateProject, t as getGodotVersion, s as GameEngine, u as createProject, v as DEFAULT_SHIPPED_FILES_GLOBS, w as DEFAULT_IGNORED_FILES_GLOBS, P as Platform, J as JobStatus, W as WEB_URL, E as getProject, C as CredentialsType, Q as getGoogleStatus, B as BaseAuthenticatedCommand, j as isCWDGodotGame } from '../../index-BhhiXbey.js';
5
- import { Box, Text, useInput } from 'ink';
4
+ import { K as queryClient, p as getAuthedHeaders, o as API_URL, I as castArrayObjectDates, a9 as updateProject, t as getGodotVersion, s as GameEngine, u as createProject, v as DEFAULT_SHIPPED_FILES_GLOBS, w as DEFAULT_IGNORED_FILES_GLOBS, P as Platform, J as JobStatus, W as WEB_URL, E as getProject, C as CredentialsType, Q as getGoogleStatus, B as BaseAuthenticatedCommand, j as isCWDGodotGame } from '../../index-pj8JVg5X.js';
5
+ import { Box, Text } from 'ink';
6
6
  import Spinner from 'ink-spinner';
7
7
  import 'node:crypto';
8
8
  import fs__default from 'node:fs';
@@ -23,31 +23,31 @@ import 'socket.io-client';
23
23
  import 'string-length';
24
24
  import 'strip-ansi';
25
25
  import 'open';
26
- import { C as ConnectGoogle } from '../../index-C03TV1_J.js';
27
- import { C as CommandContext, G as GameContext, u as useBuilds, M as Markdown, q as queryBuilds, c as GameProvider, f as CreateGooglePlayGame } from '../../index-C66Dd8Xc.js';
26
+ import { C as ConnectGoogle } from '../../index-DC0GJtAy.js';
27
+ import { C as CommandContext, G as GameContext, u as useBuilds, M as Markdown, e as useSafeInput, q as queryBuilds, c as GameProvider, h as CreateGooglePlayGame } from '../../index-DfUg5j06.js';
28
28
  import { TextInput, Alert } from '@inkjs/ui';
29
29
  import 'marked';
30
30
  import 'marked-terminal';
31
31
  import 'qrcode';
32
- import { g as getShortUUID } from '../../index-CGBdOm1q.js';
33
- import { J as JobLogTail } from '../../JobLogTail-0CBLoG8N.js';
34
- import { c as cacheKeys, f as fetchKeyTestResult, K as KeyTestStatus, a as KeyTestError } from '../../useAndroidServiceAccountTestResult-DZk5SMxI.js';
35
- import { u as useShip, J as JobProgress } from '../../JobProgress-lKqVT88m.js';
36
- import { C as CreateServiceAccountKey } from '../../index-CS9Gwcb0.js';
37
- import { C as CreateKeystore } from '../../Create-3Ob8sjik.js';
38
- import { I as ImportKeystore } from '../../Import-CFuPDI0K.js';
39
- import { a as getProjectCredentials } from '../../index-CtTI85m-.js';
32
+ import { g as getShortUUID } from '../../index-B27WJDxn.js';
33
+ import { J as JobLogTail } from '../../JobLogTail-BYcJgPcL.js';
34
+ import { c as cacheKeys, f as fetchKeyTestResult, K as KeyTestStatus, a as KeyTestError } from '../../useAndroidServiceAccountTestResult-D4e5AKAZ.js';
35
+ import { u as useShip, J as JobProgress } from '../../JobProgress-BcrE7CUK.js';
36
+ import { C as CreateServiceAccountKey } from '../../index-CisLwc7e.js';
37
+ import { C as CreateKeystore } from '../../Create-Lpe0B8nT.js';
38
+ import { I as ImportKeystore } from '../../Import-DFzrAG04.js';
39
+ import { a as getProjectCredentials } from '../../index-Crv7S0bl.js';
40
40
  import { T as Title } from '../../Title-BCQtayg6.js';
41
- import { C as Command } from '../../Command-WPpmLPkL.js';
41
+ import { C as Command } from '../../Command-BDIkuv2g.js';
42
42
  import '@expo/apple-utils/build/index.js';
43
43
  import 'deepmerge';
44
44
  import 'ini';
45
- import '../../useWebSocket-5PYa2QER.js';
45
+ import '../../useWebSocket-CRV7V69Q.js';
46
46
  import '../../git-BpsfNFZ_.js';
47
- import '../../ProgressSpinner-DGcakQSK.js';
48
- import '../../useProjectCredentials-BEphqa18.js';
47
+ import '../../ProgressSpinner-Um6ARKlk.js';
48
+ import '../../useProjectCredentials-BjvdJdQg.js';
49
49
  import '../../RunWithSpinner-gMVA07bZ.js';
50
- import '../../import-DGvG5REx.js';
50
+ import '../../import-BoY5e0uJ.js';
51
51
 
52
52
  const useInviteServiceAccount = () => useMutation({
53
53
  async mutationFn({ developerId, projectId }) {
@@ -290,7 +290,7 @@ const CreateForGame = ({ gameId, onComplete, onError, ...boxProps }) => {
290
290
  /* @__PURE__ */ jsx(Text, { children: "Create an initial build..." }),
291
291
  (isLoadingBuilds || isLoadingJobs || shipMutation.isPending) && /* @__PURE__ */ jsx(Spinner, { type: "dots" })
292
292
  ] }),
293
- androidJob == null && /* @__PURE__ */ jsx(Text, { children: shipLog }),
293
+ androidJob === null && /* @__PURE__ */ jsx(Text, { children: shipLog }),
294
294
  androidJob && /* @__PURE__ */ jsx(JobProgress, { job: androidJob, onComplete, onFailure: (j) => {
295
295
  setFailedJob(j);
296
296
  setTimeout(() => {
@@ -430,7 +430,7 @@ const CreateOrImport = ({ onComplete, onError, ...boxProps }) => {
430
430
  keyPassword: "",
431
431
  keystorePassword: ""
432
432
  });
433
- useInput(async (input) => {
433
+ useSafeInput(async (input) => {
434
434
  if (stage !== 0 /* Choose */) return;
435
435
  if (input === "c") return setStage(1 /* Create */);
436
436
  if (input === "i") return setStage(2 /* ImportForm */);
@@ -510,12 +510,12 @@ const getStatusFlags = async (cmd) => {
510
510
  const hasAndroidPackageName = project && Boolean(project?.details?.androidPackageName);
511
511
  const projectCredentials = hasShipThisProject ? await getProjectCredentials(project.id) : [];
512
512
  const hasAndroidKeystore = projectCredentials.some(
513
- (cred) => cred.isActive && cred.platform === Platform.ANDROID && cred.type == CredentialsType.CERTIFICATE
513
+ (cred) => cred.isActive && cred.platform === Platform.ANDROID && cred.type === CredentialsType.CERTIFICATE
514
514
  );
515
515
  const googleStatus = await getGoogleStatus();
516
516
  const hasGoogleConnection = googleStatus.isAuthenticated;
517
517
  const hasServiceAccountKey = projectCredentials.some(
518
- (cred) => cred.isActive && cred.platform == Platform.ANDROID && cred.type == CredentialsType.KEY
518
+ (cred) => cred.isActive && cred.platform === Platform.ANDROID && cred.type === CredentialsType.KEY
519
519
  );
520
520
  const buildsResponse = Boolean(projectId) && hasShipThisProject && await queryBuilds({ pageNumber: 0, projectId });
521
521
  const hasInitialBuild = Boolean(buildsResponse) && buildsResponse.data.some((build) => build.platform === Platform.ANDROID);
@@ -1,7 +1,7 @@
1
1
  import fs__default, { promises } from 'node:fs';
2
2
  import path from 'node:path';
3
3
  import { Args, Flags } from '@oclif/core';
4
- import { V as BaseCommand } from '../../index-BhhiXbey.js';
4
+ import { V as BaseCommand } from '../../index-pj8JVg5X.js';
5
5
  import 'axios';
6
6
  import 'crypto-js';
7
7
  import 'uuid';
@@ -20,6 +20,7 @@ import 'fast-glob';
20
20
  import 'yazl';
21
21
  import 'socket.io-client';
22
22
  import 'fullscreen-ink';
23
+ import 'ink';
23
24
 
24
25
  function generateFastlaneSession(cookieData) {
25
26
  return cookieData.cookies.map((cookie) => `- !ruby/object:HTTP::Cookie
@@ -3,7 +3,7 @@ import path from 'node:path';
3
3
  import { Args, Flags } from '@oclif/core';
4
4
  import require$$0 from 'fs';
5
5
  import require$$1 from 'path';
6
- import { V as BaseCommand } from '../../index-BhhiXbey.js';
6
+ import { V as BaseCommand } from '../../index-pj8JVg5X.js';
7
7
  import CustomHelp from '../../utils/help.js';
8
8
  import 'axios';
9
9
  import 'crypto-js';
@@ -23,6 +23,7 @@ import 'fast-glob';
23
23
  import 'yazl';
24
24
  import 'socket.io-client';
25
25
  import 'fullscreen-ink';
26
+ import 'ink';
26
27
 
27
28
  function getDefaultExportFromCjs (x) {
28
29
  return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
@@ -1,7 +1,7 @@
1
1
  import { Flags } from '@oclif/core';
2
2
  import axios from 'axios';
3
- import { W as WEB_URL, V as BaseCommand, o as API_URL, Y as setAuthToken, Z as acceptTerms } from '../index-BhhiXbey.js';
4
- import { a as getInput } from '../index-CGBdOm1q.js';
3
+ import { W as WEB_URL, V as BaseCommand, o as API_URL, Y as setAuthToken, Z as acceptTerms } from '../index-pj8JVg5X.js';
4
+ import { a as getInput } from '../index-B27WJDxn.js';
5
5
  import 'node:fs';
6
6
  import 'crypto-js';
7
7
  import 'uuid';
@@ -21,6 +21,7 @@ import 'fast-glob';
21
21
  import 'yazl';
22
22
  import 'socket.io-client';
23
23
  import 'fullscreen-ink';
24
+ import 'ink';
24
25
 
25
26
  const TERMS_URL = new URL("/terms", WEB_URL).href;
26
27
  const PRIVACY_URL = new URL("/privacy", WEB_URL).href;
@@ -1,6 +1,6 @@
1
1
  import { jsxs, jsx } from 'react/jsx-runtime';
2
2
  import { render } from 'ink';
3
- import { V as BaseCommand, j as isCWDGodotGame } from '../index-BhhiXbey.js';
3
+ import { V as BaseCommand, j as isCWDGodotGame } from '../index-pj8JVg5X.js';
4
4
  import 'ink-spinner';
5
5
  import 'node:crypto';
6
6
  import 'node:fs';
@@ -29,15 +29,15 @@ import 'marked';
29
29
  import 'marked-terminal';
30
30
  import { N as NextSteps } from '../NextSteps-DbJHmscQ.js';
31
31
  import 'qrcode';
32
- import '../index-C66Dd8Xc.js';
33
- import { C as Command } from '../Command-WPpmLPkL.js';
32
+ import '../index-DfUg5j06.js';
33
+ import { C as Command } from '../Command-BDIkuv2g.js';
34
34
  import '@expo/apple-utils/build/index.js';
35
35
  import 'isomorphic-git';
36
36
  import 'deepmerge';
37
37
  import 'ini';
38
38
  import '../Title-BCQtayg6.js';
39
- import '../index-CGBdOm1q.js';
40
- import '../useAndroidServiceAccountTestResult-DZk5SMxI.js';
39
+ import '../index-B27WJDxn.js';
40
+ import '../useAndroidServiceAccountTestResult-D4e5AKAZ.js';
41
41
 
42
42
  class Status extends BaseCommand {
43
43
  static args = {};
@@ -1,6 +1,6 @@
1
1
  import * as fs from 'node:fs';
2
2
  import axios from 'axios';
3
- import { o as API_URL, p as getAuthedHeaders } from './index-BhhiXbey.js';
3
+ import { o as API_URL, p as getAuthedHeaders } from './index-pj8JVg5X.js';
4
4
 
5
5
  async function exportCredential({ credentialId, projectId, zipPath }) {
6
6
  const headers = getAuthedHeaders();
@@ -1,6 +1,6 @@
1
1
  import { promises } from 'node:fs';
2
2
  import axios from 'axios';
3
- import { o as API_URL, p as getAuthedHeaders } from './index-BhhiXbey.js';
3
+ import { o as API_URL, p as getAuthedHeaders } from './index-pj8JVg5X.js';
4
4
 
5
5
  async function getNewImportTicket(projectId) {
6
6
  const url = projectId ? `${API_URL}/projects/${projectId}/credentials/import/url` : `${API_URL}/credentials/import/url`;
@@ -4,7 +4,7 @@ import path from 'node:path';
4
4
  import { promises } from 'node:readline';
5
5
  import { fileURLToPath } from 'node:url';
6
6
  import readlineSync from 'readline-sync';
7
- import { L as JobStage, P as Platform, M as LogLevel, J as JobStatus } from './index-BhhiXbey.js';
7
+ import { L as JobStage, P as Platform, M as LogLevel, J as JobStatus } from './index-pj8JVg5X.js';
8
8
  import 'luxon';
9
9
  import 'axios';
10
10
  import 'isomorphic-git';
@@ -17,6 +17,7 @@ import 'fast-glob';
17
17
  import 'yazl';
18
18
  import 'socket.io-client';
19
19
  import 'fullscreen-ink';
20
+ import 'ink';
20
21
 
21
22
  function getShortUUID(originalUuid) {
22
23
  return originalUuid.slice(0, 8);
@@ -11,17 +11,17 @@ import 'readline-sync';
11
11
  import 'luxon';
12
12
  import axios from 'axios';
13
13
  import 'isomorphic-git';
14
- import { p as getAuthedHeaders, o as API_URL, a1 as castObjectDates, P as Platform, C as CredentialsType, Q as getGoogleStatus } from './index-BhhiXbey.js';
14
+ import { p as getAuthedHeaders, o as API_URL, a1 as castObjectDates, P as Platform, C as CredentialsType, Q as getGoogleStatus } from './index-pj8JVg5X.js';
15
15
  import '@oclif/core';
16
16
  import { useQuery, useQueryClient } from '@tanstack/react-query';
17
- import { c as cacheKeys } from './useAndroidServiceAccountTestResult-DZk5SMxI.js';
17
+ import { c as cacheKeys } from './useAndroidServiceAccountTestResult-D4e5AKAZ.js';
18
18
  import 'fast-glob';
19
19
  import 'uuid';
20
20
  import 'yazl';
21
21
  import 'socket.io-client';
22
22
  import 'fullscreen-ink';
23
- import { u as useWebSocket } from './useWebSocket-5PYa2QER.js';
24
- import { u as useProjectCredentials } from './useProjectCredentials-BEphqa18.js';
23
+ import { u as useWebSocket } from './useWebSocket-CRV7V69Q.js';
24
+ import { u as useProjectCredentials } from './useProjectCredentials-BjvdJdQg.js';
25
25
  import 'crypto-js';
26
26
  import 'string-length';
27
27
  import 'strip-ansi';
@@ -29,9 +29,9 @@ import 'open';
29
29
  import '@inkjs/ui';
30
30
  import 'marked';
31
31
  import 'marked-terminal';
32
- import { P as ProgressSpinner } from './ProgressSpinner-DGcakQSK.js';
32
+ import { P as ProgressSpinner } from './ProgressSpinner-Um6ARKlk.js';
33
33
  import 'qrcode';
34
- import { G as GameContext } from './index-C66Dd8Xc.js';
34
+ import { G as GameContext } from './index-DfUg5j06.js';
35
35
 
36
36
  async function fetchStatus({ projectId }) {
37
37
  try {
@@ -56,7 +56,7 @@ const useAndroidServiceAccountSetupStatus = (props) => useQuery({
56
56
  const ERR_NOT_AUTHENTICATED = "You must be connected to Google to create a Service Account Key";
57
57
  const useHasServiceAccountKey = (projectId) => {
58
58
  const { data, isSuccess } = useProjectCredentials({ platform: Platform.ANDROID, projectId });
59
- return isSuccess && data.data.some((cred) => cred.isActive && cred.platform === Platform.ANDROID && cred.type == CredentialsType.KEY);
59
+ return isSuccess && data.data.some((cred) => cred.isActive && cred.platform === Platform.ANDROID && cred.type === CredentialsType.KEY);
60
60
  };
61
61
  const useAndroidServiceAccount = ({ onComplete, onError, projectId }) => {
62
62
  const queryClient = useQueryClient();
@@ -1,5 +1,5 @@
1
1
  import axios from 'axios';
2
- import { o as API_URL, p as getAuthedHeaders, I as castArrayObjectDates } from './index-BhhiXbey.js';
2
+ import { o as API_URL, p as getAuthedHeaders, I as castArrayObjectDates } from './index-pj8JVg5X.js';
3
3
  import 'node:fs';
4
4
 
5
5
  async function getUserCredentials(pageSize = 100) {
@@ -1,5 +1,5 @@
1
1
  import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
2
- import { Text, useInput, Box } from 'ink';
2
+ import { Text, Box } from 'ink';
3
3
  import open from 'open';
4
4
  import { useState, useEffect, useContext } from 'react';
5
5
  import 'ink-spinner';
@@ -12,7 +12,7 @@ import 'readline-sync';
12
12
  import 'luxon';
13
13
  import 'axios';
14
14
  import 'isomorphic-git';
15
- import { Q as getGoogleStatus, a2 as getShortAuthRequiredUrl, a3 as getGoogleAuthUrl, W as WEB_URL } from './index-BhhiXbey.js';
15
+ import { Q as getGoogleStatus, a2 as getShortAuthRequiredUrl, a3 as getGoogleAuthUrl, W as WEB_URL } from './index-pj8JVg5X.js';
16
16
  import '@oclif/core';
17
17
  import { useQuery } from '@tanstack/react-query';
18
18
  import 'crypto-js';
@@ -20,13 +20,13 @@ import 'uuid';
20
20
  import 'fast-glob';
21
21
  import 'yazl';
22
22
  import 'socket.io-client';
23
- import { c as cacheKeys } from './useAndroidServiceAccountTestResult-DZk5SMxI.js';
24
- import { u as useWebSocket } from './useWebSocket-5PYa2QER.js';
23
+ import { c as cacheKeys } from './useAndroidServiceAccountTestResult-D4e5AKAZ.js';
24
+ import { u as useWebSocket } from './useWebSocket-CRV7V69Q.js';
25
25
  import 'fullscreen-ink';
26
+ import { G as GameContext, e as useSafeInput, M as Markdown } from './index-DfUg5j06.js';
26
27
  import 'string-length';
27
28
  import 'strip-ansi';
28
29
  import '@inkjs/ui';
29
- import { G as GameContext, M as Markdown } from './index-C66Dd8Xc.js';
30
30
  import 'marked';
31
31
  import 'marked-terminal';
32
32
  import qrcode from 'qrcode';
@@ -97,6 +97,14 @@ const ConnectGoogle = (props) => {
97
97
  };
98
98
  const ConnectForGame = ({ gameId, helpPage, onComplete, onError, ...boxProps }) => {
99
99
  const [showQRCode, setShowQRCode] = useState(false);
100
+ const [connectUrl, setConnectUrl] = useState(null);
101
+ useEffect(() => {
102
+ const fetchConnectUrl = async () => {
103
+ const url = await getConnectUrl(gameId, Boolean(helpPage));
104
+ setConnectUrl(url);
105
+ };
106
+ if (!connectUrl) fetchConnectUrl();
107
+ }, []);
100
108
  useGoogleStatusWatching({
101
109
  isWatching: true,
102
110
  onGoogleStatusUpdate(status) {
@@ -104,7 +112,7 @@ const ConnectForGame = ({ gameId, helpPage, onComplete, onError, ...boxProps })
104
112
  },
105
113
  projectId: gameId
106
114
  });
107
- useInput(async (input) => {
115
+ useSafeInput(async (input) => {
108
116
  switch (input) {
109
117
  case "q": {
110
118
  setShowQRCode(true);
@@ -116,8 +124,8 @@ const ConnectForGame = ({ gameId, helpPage, onComplete, onError, ...boxProps })
116
124
  }
117
125
  case "b": {
118
126
  if (!gameId) return;
119
- const url = await getConnectUrl(gameId, true);
120
- await open(url);
127
+ if (!connectUrl) return;
128
+ await open(connectUrl);
121
129
  }
122
130
  }
123
131
  });
@@ -127,7 +135,7 @@ const ConnectForGame = ({ gameId, helpPage, onComplete, onError, ...boxProps })
127
135
  return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", gap: 1, ...boxProps, children: [
128
136
  !showQRCode && /* @__PURE__ */ jsxs(Box, { flexDirection: "column", gap: 1, children: [
129
137
  /* @__PURE__ */ jsx(Markdown, { filename: "privacy-notification.md", templateVars }),
130
- /* @__PURE__ */ jsx(Text, { bold: true, color: "#4CE64C", children: "Press B to open your browser and connect your Google account to ShipThis" }),
138
+ connectUrl && /* @__PURE__ */ jsx(Text, { bold: true, color: "#4CE64C", children: `Press B to open ${connectUrl} in your browser and connect your Google account to ShipThis` }),
131
139
  /* @__PURE__ */ jsx(Text, { bold: true, color: "#4CE64C", children: "Press Q to show a QR-code to connect using your mobile phone" })
132
140
  ] }),
133
141
  showQRCode && /* @__PURE__ */ jsxs(Box, { flexDirection: "column", gap: 1, children: [
@@ -1,13 +1,13 @@
1
1
  import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
2
- import { Text, useInput, Box } from 'ink';
2
+ import { useStdin, useInput, Text, Box } from 'ink';
3
3
  import Spinner from 'ink-spinner';
4
4
  import open from 'open';
5
5
  import React, { useState, useEffect, useContext, useRef } from 'react';
6
- import { p as getAuthedHeaders, o as API_URL, I as castArrayObjectDates, P as Platform, a6 as getShortDateTime, J as JobStatus, a7 as getShortTimeDelta, z as getJob, E as getProject, a2 as getShortAuthRequiredUrl, K as queryClient, a8 as BuildType, W as WEB_URL } from './index-BhhiXbey.js';
7
- import { h as getPlatformName, g as getShortUUID, s as scriptDir } from './index-CGBdOm1q.js';
6
+ import { p as getAuthedHeaders, o as API_URL, I as castArrayObjectDates, P as Platform, a6 as getShortDateTime, J as JobStatus, a7 as getShortTimeDelta, z as getJob, E as getProject, a2 as getShortAuthRequiredUrl, K as queryClient, a8 as BuildType, W as WEB_URL } from './index-pj8JVg5X.js';
7
+ import { h as getPlatformName, g as getShortUUID, s as scriptDir } from './index-B27WJDxn.js';
8
8
  import { useQuery } from '@tanstack/react-query';
9
9
  import axios from 'axios';
10
- import { c as cacheKeys, u as useAndroidServiceAccountTestResult, K as KeyTestStatus, a as KeyTestError } from './useAndroidServiceAccountTestResult-DZk5SMxI.js';
10
+ import { c as cacheKeys, u as useAndroidServiceAccountTestResult, K as KeyTestStatus, a as KeyTestError } from './useAndroidServiceAccountTestResult-D4e5AKAZ.js';
11
11
  import 'luxon';
12
12
  import fs__default from 'node:fs';
13
13
  import 'fast-glob';
@@ -38,7 +38,7 @@ async function queryBuilds({ projectId, ...pageAndSortParams }) {
38
38
  }
39
39
  }
40
40
  function getBuildSummary(build) {
41
- const ext = build.buildType || (build.platform == Platform.IOS ? "IPA" : "AAB");
41
+ const ext = build.buildType || (build.platform === Platform.IOS ? "IPA" : "AAB");
42
42
  const filename = `game.${ext.toLowerCase()}`;
43
43
  return {
44
44
  id: getShortUUID(build.id),
@@ -83,6 +83,18 @@ const useJob = (props) => useQuery({
83
83
  queryKey: cacheKeys.job(props)
84
84
  });
85
85
 
86
+ const useSafeInput = (handler, options = { isActive: true }) => {
87
+ const { isRawModeSupported } = useStdin();
88
+ const isActive = isRawModeSupported === true && options.isActive !== false;
89
+ useInput(
90
+ (input, key) => {
91
+ const lowerInput = input.toLowerCase();
92
+ return handler(lowerInput, key);
93
+ },
94
+ { isActive }
95
+ );
96
+ };
97
+
86
98
  const cleanHyperlinks = (input) => (
87
99
  // When we run in a <ScrollArea> the links break
88
100
  // Remove OSC 8 hyperlink wrappers but preserve the styled content inside
@@ -173,7 +185,7 @@ const Create = ({ gameId, onComplete, onError, ...boxProps }) => {
173
185
  }
174
186
  previousIsFound.current = isFound;
175
187
  }, [result]);
176
- useInput(async (input) => {
188
+ useSafeInput(async (input) => {
177
189
  if (!gameId) return;
178
190
  switch (input) {
179
191
  case "r": {
@@ -185,14 +197,13 @@ const Create = ({ gameId, onComplete, onError, ...boxProps }) => {
185
197
  case "d": {
186
198
  const dashUrl = await getShortAuthRequiredUrl(`/games/${getShortUUID(gameId)}/builds`);
187
199
  await open(dashUrl);
200
+ break;
188
201
  }
189
202
  }
190
- if (input !== "r") return;
191
- queryClient.invalidateQueries({
192
- queryKey: cacheKeys.androidKeyTestResult({ projectId: gameId })
193
- });
194
203
  });
195
- const initialBuild = builds?.data.find((build) => build.platform === Platform.ANDROID && build.buildType === BuildType.AAB);
204
+ const initialBuild = builds?.data.find(
205
+ (build) => build.platform === Platform.ANDROID && build.buildType === BuildType.AAB
206
+ );
196
207
  const downloadCmd = initialBuild ? `${getBuildSummary(initialBuild).cmd}` : "Initial AAB build not found!";
197
208
  const templateVars = {
198
209
  dashboardURL: new URL(`/games/${getShortUUID(gameId)}/builds`, WEB_URL).toString(),
@@ -207,4 +218,4 @@ const Create = ({ gameId, onComplete, onError, ...boxProps }) => {
207
218
  ] }) });
208
219
  };
209
220
 
210
- export { CommandContext as C, GameContext as G, Markdown as M, getJobSummary as a, CommandProvider as b, GameProvider as c, getBuildSummary as d, useJob as e, CreateGooglePlayGame as f, getRenderedMarkdown as g, queryBuilds as q, useBuilds as u };
221
+ export { CommandContext as C, GameContext as G, Markdown as M, getJobSummary as a, CommandProvider as b, GameProvider as c, getBuildSummary as d, useSafeInput as e, useJob as f, getRenderedMarkdown as g, CreateGooglePlayGame as h, queryBuilds as q, useBuilds as u };
@@ -20,6 +20,7 @@ import 'fast-glob';
20
20
  import 'yazl';
21
21
  import 'socket.io-client';
22
22
  import 'fullscreen-ink';
23
+ import 'ink';
23
24
 
24
25
  const AUTH_ENV_VAR_NAME = "SHIPTHIS_TOKEN";
25
26
  const DOMAIN_ENV_VAR_NAME = "SHIPTHIS_DOMAIN";
@@ -109,7 +110,7 @@ function getShortTimeDelta(start, end) {
109
110
  });
110
111
  }
111
112
 
112
- var currentAuthToken;
113
+ let currentAuthToken;
113
114
  function setAuthToken(token) {
114
115
  currentAuthToken = token;
115
116
  }
@@ -359,7 +360,7 @@ function getGodotProjectCapabilities(platform) {
359
360
  const capabilities = [];
360
361
  for (const capability of GODOT_CAPABILITIES) {
361
362
  if (!(capability.key in options)) continue;
362
- if (`${options[capability.key]}`.toLocaleLowerCase() == "true") capabilities.push(capability.type);
363
+ if (`${options[capability.key]}`.toLocaleLowerCase() === "true") capabilities.push(capability.type);
363
364
  }
364
365
  return capabilities;
365
366
  }
@@ -415,7 +416,7 @@ function getGodotExportPresets(platform) {
415
416
  if (isFound) {
416
417
  const exportPresetsContent = fs__default.readFileSync(exportPresetsPath, "utf8");
417
418
  const exportPresetsIni = parse(exportPresetsContent);
418
- const presetIndexes = Object.keys(exportPresetsIni.preset);
419
+ const presetIndexes = Object.keys(exportPresetsIni.preset || {});
419
420
  const presetIndex = presetIndexes.find((index) => {
420
421
  const current = exportPresetsIni.preset[index];
421
422
  return `${current.name}`.toUpperCase() === platform;
@@ -1,5 +1,5 @@
1
1
  import axios from 'axios';
2
- import { o as API_URL, p as getAuthedHeaders } from './index-BhhiXbey.js';
2
+ import { o as API_URL, p as getAuthedHeaders } from './index-pj8JVg5X.js';
3
3
 
4
4
  async function getNewUploadTicket(projectId = null) {
5
5
  const url = projectId ? `${API_URL}/projects/${projectId}/credentials/url` : `${API_URL}/credentials/url`;
@@ -1,6 +1,6 @@
1
1
  import { useQuery } from '@tanstack/react-query';
2
2
  import axios from 'axios';
3
- import { o as API_URL, p as getAuthedHeaders } from './index-BhhiXbey.js';
3
+ import { o as API_URL, p as getAuthedHeaders } from './index-pj8JVg5X.js';
4
4
 
5
5
  const cacheKeys = {
6
6
  androidKeyTestResult: (props) => ["androidKeyTestResult", ...Object.values(props)],