shipthis 0.1.9 → 0.1.11

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 (134) hide show
  1. package/assets/markdown/create-or-import-keystore.md +7 -0
  2. package/dist/AppleBundleIdDetails-CjP5y0cj.js +74 -0
  3. package/dist/AppleBundleIdDetails-CztWY_mT.js +73 -0
  4. package/dist/AppleBundleIdDetails-DKeSAte9.js +73 -0
  5. package/dist/AppleBundleIdDetails-DymjrhOZ.js +73 -0
  6. package/dist/Command-BiB9MqbJ.js +204 -0
  7. package/dist/Command-D6rWEZRM.js +204 -0
  8. package/dist/Command-Dn0P_KOV.js +205 -0
  9. package/dist/Command-YJJp90ru.js +204 -0
  10. package/dist/CommandGame-C1oTlfdb.js +8 -0
  11. package/dist/CommandGame-cPaTk1wh.js +8 -0
  12. package/dist/CommandGame-k04mHiDl.js +8 -0
  13. package/dist/CommandGame-pI9VXKxi.js +8 -0
  14. package/dist/Create-DIaSKUpl.js +56 -0
  15. package/dist/CreateKeystore-BnNdeDUa.js +57 -0
  16. package/dist/CreateKeystore-Cf-nsK_M.js +56 -0
  17. package/dist/CreateKeystore-g1z6DsU5.js +56 -0
  18. package/dist/Import-BIOsf8AA.js +107 -0
  19. package/dist/JobProgress-CPkWVSlH.js +108 -0
  20. package/dist/JobProgress-W0QQR49T.js +108 -0
  21. package/dist/JobProgress-biiLhigg.js +109 -0
  22. package/dist/JobProgress-jmGAzvxS.js +108 -0
  23. package/dist/JobStatusTable-BA_q-kgE.js +75 -0
  24. package/dist/JobStatusTable-ByW0bN6c.js +75 -0
  25. package/dist/JobStatusTable-CgaTS7jS.js +75 -0
  26. package/dist/JobStatusTable-DqoppRro.js +75 -0
  27. package/dist/ProjectCredentialsTable-8kXt7sTS.js +37 -0
  28. package/dist/ProjectCredentialsTable-DRMK_SNw.js +37 -0
  29. package/dist/ProjectCredentialsTable-DfkpvTf8.js +37 -0
  30. package/dist/UserCredentialsTable-DMh8Wpy7.js +82 -0
  31. package/dist/UserCredentialsTable-DgHZJSHG.js +82 -0
  32. package/dist/UserCredentialsTable-TflQvTEP.js +82 -0
  33. package/dist/baseAppleCommand-1isaFxCQ.js +10 -0
  34. package/dist/baseAppleCommand-B9wyIqdL.js +10 -0
  35. package/dist/baseAppleCommand-DpasCbje.js +10 -0
  36. package/dist/baseGameAndroidCommand-6vsMpE7a.js +43 -0
  37. package/dist/baseGameAndroidCommand-B3LRG701.js +43 -0
  38. package/dist/baseGameAndroidCommand-C9BuS2Sr.js +43 -0
  39. package/dist/commands/apple/apiKey/create.js +10 -10
  40. package/dist/commands/apple/apiKey/export.js +8 -8
  41. package/dist/commands/apple/apiKey/import.js +8 -8
  42. package/dist/commands/apple/apiKey/status.js +7 -7
  43. package/dist/commands/apple/certificate/create.js +10 -10
  44. package/dist/commands/apple/certificate/export.js +8 -8
  45. package/dist/commands/apple/certificate/import.js +8 -8
  46. package/dist/commands/apple/certificate/status.js +7 -7
  47. package/dist/commands/apple/login.js +2 -2
  48. package/dist/commands/apple/status.js +6 -6
  49. package/dist/commands/dashboard.js +1 -1
  50. package/dist/commands/game/android/apiKey/connect.js +11 -11
  51. package/dist/commands/game/android/apiKey/create.js +13 -13
  52. package/dist/commands/game/android/apiKey/export.js +9 -9
  53. package/dist/commands/game/android/apiKey/import.js +9 -9
  54. package/dist/commands/game/android/apiKey/invite.js +4 -4
  55. package/dist/commands/game/android/apiKey/status.js +9 -9
  56. package/dist/commands/game/android/keyStore/create.js +12 -12
  57. package/dist/commands/game/android/keyStore/export.js +8 -8
  58. package/dist/commands/game/android/keyStore/import.js +49 -29
  59. package/dist/commands/game/android/keyStore/status.js +8 -8
  60. package/dist/commands/game/android/status.js +7 -7
  61. package/dist/commands/game/build/download.js +7 -7
  62. package/dist/commands/game/build/list.js +7 -7
  63. package/dist/commands/game/create.js +2 -2
  64. package/dist/commands/game/details.js +22 -8
  65. package/dist/commands/game/export.js +1 -1
  66. package/dist/commands/game/ios/app/addTester.js +6 -6
  67. package/dist/commands/game/ios/app/create.js +5 -5
  68. package/dist/commands/game/ios/app/status.js +9 -9
  69. package/dist/commands/game/ios/app/sync.js +7 -7
  70. package/dist/commands/game/ios/profile/create.js +10 -10
  71. package/dist/commands/game/ios/profile/export.js +8 -8
  72. package/dist/commands/game/ios/profile/import.js +8 -8
  73. package/dist/commands/game/ios/profile/status.js +8 -8
  74. package/dist/commands/game/ios/status.js +10 -10
  75. package/dist/commands/game/ios/wizard.js +2 -2
  76. package/dist/commands/game/job/list.js +7 -7
  77. package/dist/commands/game/job/status.js +11 -11
  78. package/dist/commands/game/list.js +7 -7
  79. package/dist/commands/game/ship.js +11 -11
  80. package/dist/commands/game/status.js +7 -7
  81. package/dist/commands/game/wizard.js +590 -35
  82. package/dist/commands/internal/fastlane.js +1 -1
  83. package/dist/commands/internal/readme.js +255 -770
  84. package/dist/commands/login.js +2 -2
  85. package/dist/commands/status.js +6 -6
  86. package/dist/export-B_F6vXIK.js +36 -0
  87. package/dist/export-C_lu1FD9.js +36 -0
  88. package/dist/export-rS9o87LD.js +36 -0
  89. package/dist/import-7T3J63j2.js +38 -0
  90. package/dist/import-Brg3zYmT.js +38 -0
  91. package/dist/import-DPbg8WvS.js +38 -0
  92. package/dist/import-v54PM_Qg.js +47 -0
  93. package/dist/index-BB7X1Pqp.js +695 -0
  94. package/dist/index-BQnkBr1Q.js +136 -0
  95. package/dist/index-BX9h2vPV.js +123 -0
  96. package/dist/index-BjGSEqP5.js +135 -0
  97. package/dist/index-Bv3x8c78.js +693 -0
  98. package/dist/index-ByOvCs4O.js +122 -0
  99. package/dist/index-BzffuqPa.js +24 -0
  100. package/dist/index-C9734Cj2.js +693 -0
  101. package/dist/index-CKYExssR.js +136 -0
  102. package/dist/index-Cz_KLwWf.js +136 -0
  103. package/dist/index-D6BH5UAM.js +135 -0
  104. package/dist/index-DOgF4dFK.js +24 -0
  105. package/dist/index-DgbQBx6x.js +122 -0
  106. package/dist/index-DxHPjZav.js +136 -0
  107. package/dist/index-m4HTrJ5J.js +135 -0
  108. package/dist/index-o9Y-84Rj.js +122 -0
  109. package/dist/upload-2naN75Zu.js +60 -0
  110. package/dist/upload-Cx71802W.js +60 -0
  111. package/dist/upload-DvAE1vDq.js +60 -0
  112. package/dist/useAndroidServiceAccountTestResult-BDc7XpKE.js +52 -0
  113. package/dist/useAndroidServiceAccountTestResult-B_ekRewZ.js +52 -0
  114. package/dist/useAndroidServiceAccountTestResult-Ce1x0Eh8.js +52 -0
  115. package/dist/useAppleApp-BEtLQa7n.js +32 -0
  116. package/dist/useAppleApp-CApC0-4Q.js +32 -0
  117. package/dist/useAppleApp-CETIcsJS.js +32 -0
  118. package/dist/useAppleBundleId-DXbMDRLd.js +64 -0
  119. package/dist/useAppleBundleId-SmzY6rkm.js +64 -0
  120. package/dist/useAppleBundleId-gPBzJwQg.js +64 -0
  121. package/dist/useJobWatching-BIG6fnTN.js +45 -0
  122. package/dist/useJobWatching-Cp-CYd90.js +45 -0
  123. package/dist/useJobWatching-D-YzSlK8.js +45 -0
  124. package/dist/useJobWatching-I_A3b36f.js +45 -0
  125. package/dist/useProjectCredentials-CKngz2rd.js +54 -0
  126. package/dist/useProjectCredentials-EapDge1I.js +54 -0
  127. package/dist/useProjectCredentials-vjedBbKl.js +54 -0
  128. package/dist/useWebSocket-Bep1zAVG.js +36 -0
  129. package/dist/useWebSocket-CBqsjHbt.js +36 -0
  130. package/dist/useWebSocket-rBLiZsKb.js +36 -0
  131. package/dist/wizard-ChPegnMW.js +133 -0
  132. package/npm-shrinkwrap.json +251 -223
  133. package/oclif.manifest.json +282 -223
  134. package/package.json +2 -4
@@ -0,0 +1,108 @@
1
+ import { v4 } from 'uuid';
2
+ import axios from 'axios';
3
+ import fg from 'fast-glob';
4
+ import fs__default from 'fs';
5
+ import yazl from 'yazl';
6
+ import { useMutation } from '@tanstack/react-query';
7
+ import { c as cacheKeys } from './useAndroidServiceAccountTestResult-Ce1x0Eh8.js';
8
+ import { $ as queryClient, x as DEFAULT_SHIPPED_FILES_GLOBS, w as DEFAULT_IGNORED_FILES_GLOBS, a0 as getNewUploadTicket, a1 as startJobsFromUpload, J as JobStatus } from './index-BB7X1Pqp.js';
9
+ import { f as getFileHash, h as getPlatformName } from './index-Cz_KLwWf.js';
10
+ import { g as getCWDGitInfo } from './git-DREGq-jc.js';
11
+ import { jsx, Fragment } from 'react/jsx-runtime';
12
+ import { useRef } from 'react';
13
+ import 'ink';
14
+ import './Command-D6rWEZRM.js';
15
+ import 'ink-spinner';
16
+ import 'crypto-js';
17
+ import 'luxon';
18
+ import '@inkjs/ui';
19
+ import 'open';
20
+ import { P as ProgressSpinner } from './ProgressSpinner-6pw1T8Iw.js';
21
+ import 'qrcode';
22
+ import 'string-length';
23
+ import 'strip-ansi';
24
+ import 'socket.io-client';
25
+ import { u as useJobWatching } from './useJobWatching-D-YzSlK8.js';
26
+
27
+ async function ship({ command, log = () => {
28
+ } }) {
29
+ log("Fetching project config...");
30
+ const projectConfig = await command.getProjectConfig();
31
+ if (!projectConfig.project) throw new Error("No project found in project config");
32
+ log("Retrieving file globs...");
33
+ const shippedFilesGlobs = projectConfig.shippedFilesGlobs || DEFAULT_SHIPPED_FILES_GLOBS;
34
+ const ignoredFilesGlobs = projectConfig.ignoredFilesGlobs || DEFAULT_IGNORED_FILES_GLOBS;
35
+ log("Finding files to include in zip...");
36
+ const files = await fg(shippedFilesGlobs, { dot: true, ignore: ignoredFilesGlobs });
37
+ log(`Found ${files.length} files, adding to zip...`);
38
+ const zipFile = new yazl.ZipFile();
39
+ for (const file of files) {
40
+ zipFile.addFile(file, file);
41
+ }
42
+ const outputZipToFile = (zip, fileName) => new Promise((resolve) => {
43
+ const outputStream = fs__default.createWriteStream(fileName);
44
+ zip.outputStream.pipe(outputStream).on("close", () => resolve());
45
+ zip.end();
46
+ });
47
+ const tmpZipFile = `${process.cwd()}/shipthis-${v4()}.zip`;
48
+ log(`Creating zip file: ${tmpZipFile}`);
49
+ await outputZipToFile(zipFile, tmpZipFile);
50
+ log("Reading zip file buffer...");
51
+ const zipBuffer = fs__default.readFileSync(tmpZipFile);
52
+ const { size } = fs__default.statSync(tmpZipFile);
53
+ log("Requesting upload ticket...");
54
+ const uploadTicket = await getNewUploadTicket(projectConfig.project.id);
55
+ log("Uploading zip file...");
56
+ await axios.put(uploadTicket.url, zipBuffer, {
57
+ headers: {
58
+ "Content-length": size,
59
+ "Content-Type": "application/zip"
60
+ }
61
+ });
62
+ log("Fetching Git info...");
63
+ const gitInfo = await getCWDGitInfo();
64
+ log("Computing file hash...");
65
+ const zipFileMd5 = await getFileHash(tmpZipFile);
66
+ const uploadDetails = {
67
+ ...gitInfo,
68
+ zipFileMd5
69
+ };
70
+ log("Starting jobs from upload...");
71
+ const jobs = await startJobsFromUpload(uploadTicket.id, uploadDetails);
72
+ log("Cleaning up temporary zip file...");
73
+ fs__default.unlinkSync(tmpZipFile);
74
+ log("Job submission complete.");
75
+ return jobs;
76
+ }
77
+ const useShip = () => {
78
+ return useMutation({
79
+ mutationFn: ship,
80
+ onSuccess: async (data) => {
81
+ queryClient.invalidateQueries({
82
+ queryKey: cacheKeys.jobs({ projectId: data[0].project.id, pageNumber: 0 })
83
+ });
84
+ }
85
+ });
86
+ };
87
+
88
+ const JobProgress = (props) => {
89
+ const prevJobStatus = useRef(props.job.status);
90
+ const handleJobUpdate = (job) => {
91
+ const completed = [JobStatus.COMPLETED, JobStatus.FAILED];
92
+ const wasRunning = !completed.includes(prevJobStatus.current);
93
+ if (completed.includes(job.status) && wasRunning) {
94
+ props.onComplete();
95
+ }
96
+ prevJobStatus.current = job.status;
97
+ };
98
+ const { progress } = useJobWatching({
99
+ projectId: props.job.project.id,
100
+ jobId: props.job.id,
101
+ isWatching: true,
102
+ onJobUpdate: handleJobUpdate
103
+ });
104
+ const label = `${getPlatformName(props.job.type)} build progress...`;
105
+ return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx(ProgressSpinner, { progress, label, spinnerType: "dots" }) });
106
+ };
107
+
108
+ export { JobProgress as J, useShip as u };
@@ -0,0 +1,75 @@
1
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
+ import { useState, useEffect } from 'react';
3
+ import { Box, Text } from 'ink';
4
+ import { DateTime } from 'luxon';
5
+ import Spinner from 'ink-spinner';
6
+ import { d as getStageColor, c as getJobStatusColor } from './index-BQnkBr1Q.js';
7
+ import { J as JobStatus } from './index-Bv3x8c78.js';
8
+ import 'axios';
9
+ import '@tanstack/react-query';
10
+ import 'crypto-js';
11
+ import 'uuid';
12
+ import 'fs';
13
+ import { g as getJobSummary, a as getBuildSummary } from './Command-YJJp90ru.js';
14
+ import 'fast-glob';
15
+ import 'yazl';
16
+ import 'socket.io-client';
17
+ import { u as useJobWatching } from './useJobWatching-Cp-CYd90.js';
18
+ import { T as Title } from './Title-BCQtayg6.js';
19
+ import { a as StatusRow, b as StatusRowLabel } from './StatusTable-Dm5St4g-.js';
20
+
21
+ const JobStatusSpinner = ({ status, showSpinner }) => /* @__PURE__ */ jsxs(Fragment, { children: [
22
+ /* @__PURE__ */ jsx(Text, { color: getJobStatusColor(status), children: `${status}` }),
23
+ showSpinner && /* @__PURE__ */ jsxs(Fragment, { children: [
24
+ /* @__PURE__ */ jsx(Text, { children: " " }),
25
+ /* @__PURE__ */ jsx(Spinner, { type: "dots" })
26
+ ] })
27
+ ] });
28
+ const JobStatusTable = ({ jobId, projectId, isWatching, onJobUpdate }) => {
29
+ const { data: job, stage, isLoading } = useJobWatching({ projectId, jobId, isWatching, onJobUpdate });
30
+ const [time, setTime] = useState(DateTime.now());
31
+ useEffect(() => {
32
+ if (!isWatching) return;
33
+ const interval = setInterval(() => setTime(DateTime.now()), 1e3);
34
+ return () => {
35
+ clearInterval(interval);
36
+ };
37
+ }, []);
38
+ const isJobInProgress = job && ![JobStatus.COMPLETED, JobStatus.FAILED].includes(job.status);
39
+ const summary = job ? getJobSummary(job, time) : null;
40
+ const buildSummary = job && job.build ? getBuildSummary(job.build) : null;
41
+ return /* @__PURE__ */ jsxs(Box, { flexDirection: "row", children: [
42
+ /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [
43
+ /* @__PURE__ */ jsx(Title, { children: "Job Details" }),
44
+ isLoading && /* @__PURE__ */ jsx(Spinner, { type: "dots" }),
45
+ summary && job && /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginLeft: 2, children: [
46
+ /* @__PURE__ */ jsx(StatusRow, { label: "ID", value: summary.id }),
47
+ /* @__PURE__ */ jsx(StatusRow, { label: "Name", value: job.project.name }),
48
+ /* @__PURE__ */ jsxs(Box, { flexDirection: "row", children: [
49
+ /* @__PURE__ */ jsx(StatusRowLabel, { label: "Status" }),
50
+ /* @__PURE__ */ jsx(JobStatusSpinner, { status: job.status, showSpinner: isWatching && !!isJobInProgress })
51
+ ] }),
52
+ /* @__PURE__ */ jsxs(Box, { flexDirection: "row", children: [
53
+ /* @__PURE__ */ jsx(StatusRowLabel, { label: "Stage" }),
54
+ stage && /* @__PURE__ */ jsx(Text, { color: getStageColor(stage), children: `${stage}` })
55
+ ] }),
56
+ /* @__PURE__ */ jsx(StatusRow, { label: "Version", value: summary.version }),
57
+ /* @__PURE__ */ jsx(StatusRow, { label: "Git Info", value: summary.gitInfo }),
58
+ /* @__PURE__ */ jsx(StatusRow, { label: "Platform", value: summary.platform }),
59
+ /* @__PURE__ */ jsx(StatusRow, { label: "Started At", value: summary.createdAt }),
60
+ /* @__PURE__ */ jsx(StatusRow, { label: "Runtime", value: summary.runtime })
61
+ ] })
62
+ ] }),
63
+ buildSummary && /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginBottom: 1, marginLeft: 3, borderStyle: "single", padding: 1, children: [
64
+ /* @__PURE__ */ jsx(Title, { children: "Build Details" }),
65
+ /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginLeft: 2, children: [
66
+ /* @__PURE__ */ jsx(StatusRow, { label: "ID", value: buildSummary.id }),
67
+ /* @__PURE__ */ jsx(StatusRow, { label: "Platform", value: buildSummary.platform }),
68
+ /* @__PURE__ */ jsx(StatusRow, { label: "Type", value: buildSummary.type }),
69
+ /* @__PURE__ */ jsx(StatusRow, { label: "CMD", value: buildSummary.cmd })
70
+ ] })
71
+ ] })
72
+ ] });
73
+ };
74
+
75
+ export { JobStatusTable as J };
@@ -0,0 +1,75 @@
1
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
+ import { useState, useEffect } from 'react';
3
+ import { Box, Text } from 'ink';
4
+ import { DateTime } from 'luxon';
5
+ import Spinner from 'ink-spinner';
6
+ import { d as getStageColor, c as getJobStatusColor } from './index-Cz_KLwWf.js';
7
+ import { J as JobStatus } from './index-BB7X1Pqp.js';
8
+ import 'axios';
9
+ import '@tanstack/react-query';
10
+ import 'crypto-js';
11
+ import 'uuid';
12
+ import 'fs';
13
+ import { g as getJobSummary, a as getBuildSummary } from './Command-D6rWEZRM.js';
14
+ import 'fast-glob';
15
+ import 'yazl';
16
+ import 'socket.io-client';
17
+ import { u as useJobWatching } from './useJobWatching-D-YzSlK8.js';
18
+ import { T as Title } from './Title-BCQtayg6.js';
19
+ import { a as StatusRow, b as StatusRowLabel } from './StatusTable-Dm5St4g-.js';
20
+
21
+ const JobStatusSpinner = ({ status, showSpinner }) => /* @__PURE__ */ jsxs(Fragment, { children: [
22
+ /* @__PURE__ */ jsx(Text, { color: getJobStatusColor(status), children: `${status}` }),
23
+ showSpinner && /* @__PURE__ */ jsxs(Fragment, { children: [
24
+ /* @__PURE__ */ jsx(Text, { children: " " }),
25
+ /* @__PURE__ */ jsx(Spinner, { type: "dots" })
26
+ ] })
27
+ ] });
28
+ const JobStatusTable = ({ jobId, projectId, isWatching, onJobUpdate }) => {
29
+ const { data: job, stage, isLoading } = useJobWatching({ projectId, jobId, isWatching, onJobUpdate });
30
+ const [time, setTime] = useState(DateTime.now());
31
+ useEffect(() => {
32
+ if (!isWatching) return;
33
+ const interval = setInterval(() => setTime(DateTime.now()), 1e3);
34
+ return () => {
35
+ clearInterval(interval);
36
+ };
37
+ }, []);
38
+ const isJobInProgress = job && ![JobStatus.COMPLETED, JobStatus.FAILED].includes(job.status);
39
+ const summary = job ? getJobSummary(job, time) : null;
40
+ const buildSummary = job && job.build ? getBuildSummary(job.build) : null;
41
+ return /* @__PURE__ */ jsxs(Box, { flexDirection: "row", children: [
42
+ /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [
43
+ /* @__PURE__ */ jsx(Title, { children: "Job Details" }),
44
+ isLoading && /* @__PURE__ */ jsx(Spinner, { type: "dots" }),
45
+ summary && job && /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginLeft: 2, children: [
46
+ /* @__PURE__ */ jsx(StatusRow, { label: "ID", value: summary.id }),
47
+ /* @__PURE__ */ jsx(StatusRow, { label: "Name", value: job.project.name }),
48
+ /* @__PURE__ */ jsxs(Box, { flexDirection: "row", children: [
49
+ /* @__PURE__ */ jsx(StatusRowLabel, { label: "Status" }),
50
+ /* @__PURE__ */ jsx(JobStatusSpinner, { status: job.status, showSpinner: isWatching && !!isJobInProgress })
51
+ ] }),
52
+ /* @__PURE__ */ jsxs(Box, { flexDirection: "row", children: [
53
+ /* @__PURE__ */ jsx(StatusRowLabel, { label: "Stage" }),
54
+ stage && /* @__PURE__ */ jsx(Text, { color: getStageColor(stage), children: `${stage}` })
55
+ ] }),
56
+ /* @__PURE__ */ jsx(StatusRow, { label: "Version", value: summary.version }),
57
+ /* @__PURE__ */ jsx(StatusRow, { label: "Git Info", value: summary.gitInfo }),
58
+ /* @__PURE__ */ jsx(StatusRow, { label: "Platform", value: summary.platform }),
59
+ /* @__PURE__ */ jsx(StatusRow, { label: "Started At", value: summary.createdAt }),
60
+ /* @__PURE__ */ jsx(StatusRow, { label: "Runtime", value: summary.runtime })
61
+ ] })
62
+ ] }),
63
+ buildSummary && /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginBottom: 1, marginLeft: 3, borderStyle: "single", padding: 1, children: [
64
+ /* @__PURE__ */ jsx(Title, { children: "Build Details" }),
65
+ /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginLeft: 2, children: [
66
+ /* @__PURE__ */ jsx(StatusRow, { label: "ID", value: buildSummary.id }),
67
+ /* @__PURE__ */ jsx(StatusRow, { label: "Platform", value: buildSummary.platform }),
68
+ /* @__PURE__ */ jsx(StatusRow, { label: "Type", value: buildSummary.type }),
69
+ /* @__PURE__ */ jsx(StatusRow, { label: "CMD", value: buildSummary.cmd })
70
+ ] })
71
+ ] })
72
+ ] });
73
+ };
74
+
75
+ export { JobStatusTable as J };
@@ -0,0 +1,75 @@
1
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
+ import { useState, useEffect } from 'react';
3
+ import { Box, Text } from 'ink';
4
+ import { DateTime } from 'luxon';
5
+ import Spinner from 'ink-spinner';
6
+ import { d as getStageColor, c as getJobStatusColor } from './index-DxHPjZav.js';
7
+ import { J as JobStatus } from './index-C9734Cj2.js';
8
+ import 'axios';
9
+ import '@tanstack/react-query';
10
+ import 'crypto-js';
11
+ import 'uuid';
12
+ import 'fs';
13
+ import { g as getJobSummary, a as getBuildSummary } from './Command-Dn0P_KOV.js';
14
+ import 'fast-glob';
15
+ import 'yazl';
16
+ import 'socket.io-client';
17
+ import { u as useJobWatching } from './useJobWatching-BIG6fnTN.js';
18
+ import { T as Title } from './Title-BCQtayg6.js';
19
+ import { a as StatusRow, b as StatusRowLabel } from './StatusTable-Dm5St4g-.js';
20
+
21
+ const JobStatusSpinner = ({ status, showSpinner }) => /* @__PURE__ */ jsxs(Fragment, { children: [
22
+ /* @__PURE__ */ jsx(Text, { color: getJobStatusColor(status), children: `${status}` }),
23
+ showSpinner && /* @__PURE__ */ jsxs(Fragment, { children: [
24
+ /* @__PURE__ */ jsx(Text, { children: " " }),
25
+ /* @__PURE__ */ jsx(Spinner, { type: "dots" })
26
+ ] })
27
+ ] });
28
+ const JobStatusTable = ({ jobId, projectId, isWatching, onJobUpdate }) => {
29
+ const { data: job, stage, isLoading } = useJobWatching({ projectId, jobId, isWatching, onJobUpdate });
30
+ const [time, setTime] = useState(DateTime.now());
31
+ useEffect(() => {
32
+ if (!isWatching) return;
33
+ const interval = setInterval(() => setTime(DateTime.now()), 1e3);
34
+ return () => {
35
+ clearInterval(interval);
36
+ };
37
+ }, []);
38
+ const isJobInProgress = job && ![JobStatus.COMPLETED, JobStatus.FAILED].includes(job.status);
39
+ const summary = job ? getJobSummary(job, time) : null;
40
+ const buildSummary = job && job.build ? getBuildSummary(job.build) : null;
41
+ return /* @__PURE__ */ jsxs(Box, { flexDirection: "row", children: [
42
+ /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [
43
+ /* @__PURE__ */ jsx(Title, { children: "Job Details" }),
44
+ isLoading && /* @__PURE__ */ jsx(Spinner, { type: "dots" }),
45
+ summary && job && /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginLeft: 2, children: [
46
+ /* @__PURE__ */ jsx(StatusRow, { label: "ID", value: summary.id }),
47
+ /* @__PURE__ */ jsx(StatusRow, { label: "Name", value: job.project.name }),
48
+ /* @__PURE__ */ jsxs(Box, { flexDirection: "row", children: [
49
+ /* @__PURE__ */ jsx(StatusRowLabel, { label: "Status" }),
50
+ /* @__PURE__ */ jsx(JobStatusSpinner, { status: job.status, showSpinner: isWatching && !!isJobInProgress })
51
+ ] }),
52
+ /* @__PURE__ */ jsxs(Box, { flexDirection: "row", children: [
53
+ /* @__PURE__ */ jsx(StatusRowLabel, { label: "Stage" }),
54
+ stage && /* @__PURE__ */ jsx(Text, { color: getStageColor(stage), children: `${stage}` })
55
+ ] }),
56
+ /* @__PURE__ */ jsx(StatusRow, { label: "Version", value: summary.version }),
57
+ /* @__PURE__ */ jsx(StatusRow, { label: "Git Info", value: summary.gitInfo }),
58
+ /* @__PURE__ */ jsx(StatusRow, { label: "Platform", value: summary.platform }),
59
+ /* @__PURE__ */ jsx(StatusRow, { label: "Started At", value: summary.createdAt }),
60
+ /* @__PURE__ */ jsx(StatusRow, { label: "Runtime", value: summary.runtime })
61
+ ] })
62
+ ] }),
63
+ buildSummary && /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginBottom: 1, marginLeft: 3, borderStyle: "single", padding: 1, children: [
64
+ /* @__PURE__ */ jsx(Title, { children: "Build Details" }),
65
+ /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginLeft: 2, children: [
66
+ /* @__PURE__ */ jsx(StatusRow, { label: "ID", value: buildSummary.id }),
67
+ /* @__PURE__ */ jsx(StatusRow, { label: "Platform", value: buildSummary.platform }),
68
+ /* @__PURE__ */ jsx(StatusRow, { label: "Type", value: buildSummary.type }),
69
+ /* @__PURE__ */ jsx(StatusRow, { label: "CMD", value: buildSummary.cmd })
70
+ ] })
71
+ ] })
72
+ ] });
73
+ };
74
+
75
+ export { JobStatusTable as J };
@@ -0,0 +1,75 @@
1
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
+ import { useState, useEffect } from 'react';
3
+ import { Box, Text } from 'ink';
4
+ import { DateTime } from 'luxon';
5
+ import Spinner from 'ink-spinner';
6
+ import { d as getStageColor, c as getJobStatusColor } from './index-Cz_KLwWf.js';
7
+ import { J as JobStatus } from './index-BB7X1Pqp.js';
8
+ import 'axios';
9
+ import '@tanstack/react-query';
10
+ import 'crypto-js';
11
+ import 'uuid';
12
+ import 'fs';
13
+ import { g as getJobSummary, a as getBuildSummary } from './Command-BiB9MqbJ.js';
14
+ import 'fast-glob';
15
+ import 'yazl';
16
+ import 'socket.io-client';
17
+ import { u as useJobWatching } from './useJobWatching-I_A3b36f.js';
18
+ import { T as Title } from './Title-BCQtayg6.js';
19
+ import { a as StatusRow, b as StatusRowLabel } from './StatusTable-Dm5St4g-.js';
20
+
21
+ const JobStatusSpinner = ({ status, showSpinner }) => /* @__PURE__ */ jsxs(Fragment, { children: [
22
+ /* @__PURE__ */ jsx(Text, { color: getJobStatusColor(status), children: `${status}` }),
23
+ showSpinner && /* @__PURE__ */ jsxs(Fragment, { children: [
24
+ /* @__PURE__ */ jsx(Text, { children: " " }),
25
+ /* @__PURE__ */ jsx(Spinner, { type: "dots" })
26
+ ] })
27
+ ] });
28
+ const JobStatusTable = ({ jobId, projectId, isWatching, onJobUpdate }) => {
29
+ const { data: job, stage, isLoading } = useJobWatching({ projectId, jobId, isWatching, onJobUpdate });
30
+ const [time, setTime] = useState(DateTime.now());
31
+ useEffect(() => {
32
+ if (!isWatching) return;
33
+ const interval = setInterval(() => setTime(DateTime.now()), 1e3);
34
+ return () => {
35
+ clearInterval(interval);
36
+ };
37
+ }, []);
38
+ const isJobInProgress = job && ![JobStatus.COMPLETED, JobStatus.FAILED].includes(job.status);
39
+ const summary = job ? getJobSummary(job, time) : null;
40
+ const buildSummary = job && job.build ? getBuildSummary(job.build) : null;
41
+ return /* @__PURE__ */ jsxs(Box, { flexDirection: "row", children: [
42
+ /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [
43
+ /* @__PURE__ */ jsx(Title, { children: "Job Details" }),
44
+ isLoading && /* @__PURE__ */ jsx(Spinner, { type: "dots" }),
45
+ summary && job && /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginLeft: 2, children: [
46
+ /* @__PURE__ */ jsx(StatusRow, { label: "ID", value: summary.id }),
47
+ /* @__PURE__ */ jsx(StatusRow, { label: "Name", value: job.project.name }),
48
+ /* @__PURE__ */ jsxs(Box, { flexDirection: "row", children: [
49
+ /* @__PURE__ */ jsx(StatusRowLabel, { label: "Status" }),
50
+ /* @__PURE__ */ jsx(JobStatusSpinner, { status: job.status, showSpinner: isWatching && !!isJobInProgress })
51
+ ] }),
52
+ /* @__PURE__ */ jsxs(Box, { flexDirection: "row", children: [
53
+ /* @__PURE__ */ jsx(StatusRowLabel, { label: "Stage" }),
54
+ stage && /* @__PURE__ */ jsx(Text, { color: getStageColor(stage), children: `${stage}` })
55
+ ] }),
56
+ /* @__PURE__ */ jsx(StatusRow, { label: "Version", value: summary.version }),
57
+ /* @__PURE__ */ jsx(StatusRow, { label: "Git Info", value: summary.gitInfo }),
58
+ /* @__PURE__ */ jsx(StatusRow, { label: "Platform", value: summary.platform }),
59
+ /* @__PURE__ */ jsx(StatusRow, { label: "Started At", value: summary.createdAt }),
60
+ /* @__PURE__ */ jsx(StatusRow, { label: "Runtime", value: summary.runtime })
61
+ ] })
62
+ ] }),
63
+ buildSummary && /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginBottom: 1, marginLeft: 3, borderStyle: "single", padding: 1, children: [
64
+ /* @__PURE__ */ jsx(Title, { children: "Build Details" }),
65
+ /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginLeft: 2, children: [
66
+ /* @__PURE__ */ jsx(StatusRow, { label: "ID", value: buildSummary.id }),
67
+ /* @__PURE__ */ jsx(StatusRow, { label: "Platform", value: buildSummary.platform }),
68
+ /* @__PURE__ */ jsx(StatusRow, { label: "Type", value: buildSummary.type }),
69
+ /* @__PURE__ */ jsx(StatusRow, { label: "CMD", value: buildSummary.cmd })
70
+ ] })
71
+ ] })
72
+ ] });
73
+ };
74
+
75
+ export { JobStatusTable as J };
@@ -0,0 +1,37 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { Box, Text } from 'ink';
3
+ import Spinner from 'ink-spinner';
4
+ import 'crypto';
5
+ import 'fs';
6
+ import 'readline-sync';
7
+ import 'node:readline';
8
+ import 'node:path';
9
+ import 'node:url';
10
+ import 'react';
11
+ import 'axios';
12
+ import '@tanstack/react-query';
13
+ import './index-BB7X1Pqp.js';
14
+ import 'crypto-js';
15
+ import 'uuid';
16
+ import 'luxon';
17
+ import { u as useProjectCredentials, g as getProjectCredentialSummary } from './useProjectCredentials-vjedBbKl.js';
18
+ import 'fast-glob';
19
+ import 'yazl';
20
+ import 'socket.io-client';
21
+ import 'isomorphic-git';
22
+ import '@oclif/core';
23
+ import { T as Table } from './Table-CvM6pccN.js';
24
+ import { T as Title } from './Title-BCQtayg6.js';
25
+
26
+ const ProjectCredentialsTable = ({ credentialTypeName, queryProps, ...boxProps }) => {
27
+ const { isLoading, data } = useProjectCredentials(queryProps);
28
+ const hasActive = data?.data.some((credential) => credential.isActive);
29
+ return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginBottom: 1, ...boxProps, children: [
30
+ /* @__PURE__ */ jsx(Title, { children: `${credentialTypeName}s in your ShipThis account` }),
31
+ /* @__PURE__ */ jsx(Box, { marginLeft: 2, marginBottom: 1, flexDirection: "column", children: /* @__PURE__ */ jsx(Text, { children: hasActive ? `You have an active ${credentialTypeName} in your ShipThis account.` : `You DO NOT have an active ${credentialTypeName} which ShipThis can use.` }) }),
32
+ isLoading && /* @__PURE__ */ jsx(Spinner, { type: "dots" }),
33
+ data && data.data.length > 0 && /* @__PURE__ */ jsx(Table, { data: data.data.map(getProjectCredentialSummary) })
34
+ ] });
35
+ };
36
+
37
+ export { ProjectCredentialsTable as P };
@@ -0,0 +1,37 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { Box, Text } from 'ink';
3
+ import Spinner from 'ink-spinner';
4
+ import 'crypto';
5
+ import 'fs';
6
+ import 'readline-sync';
7
+ import 'node:readline';
8
+ import 'node:path';
9
+ import 'node:url';
10
+ import 'react';
11
+ import 'axios';
12
+ import '@tanstack/react-query';
13
+ import './index-C9734Cj2.js';
14
+ import 'crypto-js';
15
+ import 'uuid';
16
+ import 'luxon';
17
+ import { u as useProjectCredentials, g as getProjectCredentialSummary } from './useProjectCredentials-EapDge1I.js';
18
+ import 'fast-glob';
19
+ import 'yazl';
20
+ import 'socket.io-client';
21
+ import 'isomorphic-git';
22
+ import '@oclif/core';
23
+ import { T as Table } from './Table-CvM6pccN.js';
24
+ import { T as Title } from './Title-BCQtayg6.js';
25
+
26
+ const ProjectCredentialsTable = ({ credentialTypeName, queryProps, ...boxProps }) => {
27
+ const { isLoading, data } = useProjectCredentials(queryProps);
28
+ const hasActive = data?.data.some((credential) => credential.isActive);
29
+ return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginBottom: 1, ...boxProps, children: [
30
+ /* @__PURE__ */ jsx(Title, { children: `${credentialTypeName}s in your ShipThis account` }),
31
+ /* @__PURE__ */ jsx(Box, { marginLeft: 2, marginBottom: 1, flexDirection: "column", children: /* @__PURE__ */ jsx(Text, { children: hasActive ? `You have an active ${credentialTypeName} in your ShipThis account.` : `You DO NOT have an active ${credentialTypeName} which ShipThis can use.` }) }),
32
+ isLoading && /* @__PURE__ */ jsx(Spinner, { type: "dots" }),
33
+ data && data.data.length > 0 && /* @__PURE__ */ jsx(Table, { data: data.data.map(getProjectCredentialSummary) })
34
+ ] });
35
+ };
36
+
37
+ export { ProjectCredentialsTable as P };
@@ -0,0 +1,37 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { Box, Text } from 'ink';
3
+ import Spinner from 'ink-spinner';
4
+ import 'crypto';
5
+ import 'fs';
6
+ import 'readline-sync';
7
+ import 'node:readline';
8
+ import 'node:path';
9
+ import 'node:url';
10
+ import 'react';
11
+ import 'axios';
12
+ import '@tanstack/react-query';
13
+ import './index-Bv3x8c78.js';
14
+ import 'crypto-js';
15
+ import 'uuid';
16
+ import 'luxon';
17
+ import { u as useProjectCredentials, g as getProjectCredentialSummary } from './useProjectCredentials-CKngz2rd.js';
18
+ import 'fast-glob';
19
+ import 'yazl';
20
+ import 'socket.io-client';
21
+ import 'isomorphic-git';
22
+ import '@oclif/core';
23
+ import { T as Table } from './Table-CvM6pccN.js';
24
+ import { T as Title } from './Title-BCQtayg6.js';
25
+
26
+ const ProjectCredentialsTable = ({ credentialTypeName, queryProps, ...boxProps }) => {
27
+ const { isLoading, data } = useProjectCredentials(queryProps);
28
+ const hasActive = data?.data.some((credential) => credential.isActive);
29
+ return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginBottom: 1, ...boxProps, children: [
30
+ /* @__PURE__ */ jsx(Title, { children: `${credentialTypeName}s in your ShipThis account` }),
31
+ /* @__PURE__ */ jsx(Box, { marginLeft: 2, marginBottom: 1, flexDirection: "column", children: /* @__PURE__ */ jsx(Text, { children: hasActive ? `You have an active ${credentialTypeName} in your ShipThis account.` : `You DO NOT have an active ${credentialTypeName} which ShipThis can use.` }) }),
32
+ isLoading && /* @__PURE__ */ jsx(Spinner, { type: "dots" }),
33
+ data && data.data.length > 0 && /* @__PURE__ */ jsx(Table, { data: data.data.map(getProjectCredentialSummary) })
34
+ ] });
35
+ };
36
+
37
+ export { ProjectCredentialsTable as P };
@@ -0,0 +1,82 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { Box, Text } from 'ink';
3
+ import Spinner from 'ink-spinner';
4
+ import 'crypto';
5
+ import 'fs';
6
+ import 'readline-sync';
7
+ import 'node:readline';
8
+ import 'node:path';
9
+ import 'node:url';
10
+ import 'react';
11
+ import axios from 'axios';
12
+ import { useQuery } from '@tanstack/react-query';
13
+ import { b as getShortDate, o as getAuthedHeaders, p as API_URL, M as castArrayObjectDates } from './index-C9734Cj2.js';
14
+ import 'crypto-js';
15
+ import 'uuid';
16
+ import 'luxon';
17
+ import 'fast-glob';
18
+ import 'yazl';
19
+ import { c as cacheKeys } from './useAndroidServiceAccountTestResult-B_ekRewZ.js';
20
+ import { g as getShortUUID } from './index-DxHPjZav.js';
21
+ import 'socket.io-client';
22
+ import 'isomorphic-git';
23
+ import '@oclif/core';
24
+ import { T as Table } from './Table-CvM6pccN.js';
25
+ import { T as Title } from './Title-BCQtayg6.js';
26
+
27
+ async function queryUserCredentials(params) {
28
+ try {
29
+ const headers = getAuthedHeaders();
30
+ const url = `${API_URL}/credentials`;
31
+ const response = await axios.get(url, { headers, params });
32
+ return {
33
+ ...response.data,
34
+ data: castArrayObjectDates(response.data.data)
35
+ };
36
+ } catch (error) {
37
+ console.warn("queryUserCredentials Error", error);
38
+ throw error;
39
+ }
40
+ }
41
+ function getUserCredentialSummary(credential) {
42
+ return {
43
+ id: getShortUUID(credential.id),
44
+ type: credential.type,
45
+ serial: credential.serialNumber,
46
+ isActive: credential.isActive,
47
+ createdAt: getShortDate(credential.createdAt)
48
+ };
49
+ }
50
+ const useUserCredentials = ({
51
+ platform,
52
+ type,
53
+ ...pageAndSortParams
54
+ }) => {
55
+ const queryResult = useQuery({
56
+ queryKey: cacheKeys.userCredentials(pageAndSortParams),
57
+ queryFn: async () => queryUserCredentials(pageAndSortParams),
58
+ select: (data) => {
59
+ if (!(platform || type)) return data;
60
+ return {
61
+ ...data,
62
+ data: data.data.filter((credential) => {
63
+ return (!platform || credential.platform === platform) && (!type || credential.type === type);
64
+ })
65
+ };
66
+ }
67
+ });
68
+ return queryResult;
69
+ };
70
+
71
+ const UserCredentialsTable = ({ credentialTypeName, queryProps, ...boxProps }) => {
72
+ const { isLoading, data } = useUserCredentials(queryProps);
73
+ const hasActive = data?.data.some((credential) => credential.isActive);
74
+ return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginBottom: 1, ...boxProps, children: [
75
+ /* @__PURE__ */ jsx(Title, { children: `${credentialTypeName}s in your ShipThis account` }),
76
+ /* @__PURE__ */ jsx(Box, { marginLeft: 2, marginBottom: 1, flexDirection: "column", children: /* @__PURE__ */ jsx(Text, { children: hasActive ? `You have an active ${credentialTypeName} in your ShipThis account.` : `You DO NOT have an active ${credentialTypeName} which ShipThis can use.` }) }),
77
+ isLoading && /* @__PURE__ */ jsx(Spinner, { type: "dots" }),
78
+ data && data.data.length > 0 && /* @__PURE__ */ jsx(Table, { data: data.data.map(getUserCredentialSummary) })
79
+ ] });
80
+ };
81
+
82
+ export { UserCredentialsTable as U, useUserCredentials as u };