shipthis 0.1.9 → 0.1.10

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 (122) hide show
  1. package/dist/AppleBundleIdDetails-CjP5y0cj.js +74 -0
  2. package/dist/AppleBundleIdDetails-CztWY_mT.js +73 -0
  3. package/dist/AppleBundleIdDetails-DKeSAte9.js +73 -0
  4. package/dist/Command-D6rWEZRM.js +204 -0
  5. package/dist/Command-Dn0P_KOV.js +205 -0
  6. package/dist/Command-YJJp90ru.js +204 -0
  7. package/dist/CommandGame-cPaTk1wh.js +8 -0
  8. package/dist/CommandGame-k04mHiDl.js +8 -0
  9. package/dist/CommandGame-pI9VXKxi.js +8 -0
  10. package/dist/CreateKeystore-BnNdeDUa.js +57 -0
  11. package/dist/CreateKeystore-Cf-nsK_M.js +56 -0
  12. package/dist/CreateKeystore-g1z6DsU5.js +56 -0
  13. package/dist/JobProgress-CPkWVSlH.js +108 -0
  14. package/dist/JobProgress-biiLhigg.js +109 -0
  15. package/dist/JobProgress-jmGAzvxS.js +108 -0
  16. package/dist/JobStatusTable-BA_q-kgE.js +75 -0
  17. package/dist/JobStatusTable-ByW0bN6c.js +75 -0
  18. package/dist/JobStatusTable-CgaTS7jS.js +75 -0
  19. package/dist/ProjectCredentialsTable-8kXt7sTS.js +37 -0
  20. package/dist/ProjectCredentialsTable-DRMK_SNw.js +37 -0
  21. package/dist/ProjectCredentialsTable-DfkpvTf8.js +37 -0
  22. package/dist/UserCredentialsTable-DMh8Wpy7.js +82 -0
  23. package/dist/UserCredentialsTable-DgHZJSHG.js +82 -0
  24. package/dist/UserCredentialsTable-TflQvTEP.js +82 -0
  25. package/dist/baseAppleCommand-1isaFxCQ.js +10 -0
  26. package/dist/baseAppleCommand-B9wyIqdL.js +10 -0
  27. package/dist/baseAppleCommand-DpasCbje.js +10 -0
  28. package/dist/baseGameAndroidCommand-6vsMpE7a.js +43 -0
  29. package/dist/baseGameAndroidCommand-B3LRG701.js +43 -0
  30. package/dist/baseGameAndroidCommand-C9BuS2Sr.js +43 -0
  31. package/dist/commands/apple/apiKey/create.js +7 -7
  32. package/dist/commands/apple/apiKey/export.js +6 -6
  33. package/dist/commands/apple/apiKey/import.js +6 -6
  34. package/dist/commands/apple/apiKey/status.js +5 -5
  35. package/dist/commands/apple/certificate/create.js +7 -7
  36. package/dist/commands/apple/certificate/export.js +6 -6
  37. package/dist/commands/apple/certificate/import.js +6 -6
  38. package/dist/commands/apple/certificate/status.js +5 -5
  39. package/dist/commands/apple/login.js +2 -2
  40. package/dist/commands/apple/status.js +4 -4
  41. package/dist/commands/dashboard.js +1 -1
  42. package/dist/commands/game/android/apiKey/connect.js +8 -8
  43. package/dist/commands/game/android/apiKey/create.js +10 -10
  44. package/dist/commands/game/android/apiKey/export.js +7 -7
  45. package/dist/commands/game/android/apiKey/import.js +7 -7
  46. package/dist/commands/game/android/apiKey/invite.js +4 -4
  47. package/dist/commands/game/android/apiKey/status.js +7 -7
  48. package/dist/commands/game/android/keyStore/create.js +8 -8
  49. package/dist/commands/game/android/keyStore/export.js +6 -6
  50. package/dist/commands/game/android/keyStore/import.js +6 -6
  51. package/dist/commands/game/android/keyStore/status.js +6 -6
  52. package/dist/commands/game/android/status.js +4 -4
  53. package/dist/commands/game/build/download.js +4 -4
  54. package/dist/commands/game/build/list.js +5 -5
  55. package/dist/commands/game/create.js +2 -2
  56. package/dist/commands/game/details.js +21 -7
  57. package/dist/commands/game/export.js +1 -1
  58. package/dist/commands/game/ios/app/addTester.js +5 -5
  59. package/dist/commands/game/ios/app/create.js +4 -4
  60. package/dist/commands/game/ios/app/status.js +7 -7
  61. package/dist/commands/game/ios/app/sync.js +5 -5
  62. package/dist/commands/game/ios/profile/create.js +7 -7
  63. package/dist/commands/game/ios/profile/export.js +6 -6
  64. package/dist/commands/game/ios/profile/import.js +6 -6
  65. package/dist/commands/game/ios/profile/status.js +6 -6
  66. package/dist/commands/game/ios/status.js +7 -7
  67. package/dist/commands/game/ios/wizard.js +2 -2
  68. package/dist/commands/game/job/list.js +4 -4
  69. package/dist/commands/game/job/status.js +7 -7
  70. package/dist/commands/game/list.js +4 -4
  71. package/dist/commands/game/ship.js +9 -9
  72. package/dist/commands/game/status.js +4 -4
  73. package/dist/commands/game/wizard.js +490 -34
  74. package/dist/commands/internal/fastlane.js +1 -1
  75. package/dist/commands/internal/readme.js +255 -770
  76. package/dist/commands/login.js +2 -2
  77. package/dist/commands/status.js +4 -4
  78. package/dist/export-B_F6vXIK.js +36 -0
  79. package/dist/export-C_lu1FD9.js +36 -0
  80. package/dist/export-rS9o87LD.js +36 -0
  81. package/dist/import-7T3J63j2.js +38 -0
  82. package/dist/import-Brg3zYmT.js +38 -0
  83. package/dist/import-DPbg8WvS.js +38 -0
  84. package/dist/index-BB7X1Pqp.js +695 -0
  85. package/dist/index-BQnkBr1Q.js +136 -0
  86. package/dist/index-BX9h2vPV.js +123 -0
  87. package/dist/index-BjGSEqP5.js +135 -0
  88. package/dist/index-Bv3x8c78.js +693 -0
  89. package/dist/index-ByOvCs4O.js +122 -0
  90. package/dist/index-BzffuqPa.js +24 -0
  91. package/dist/index-C9734Cj2.js +693 -0
  92. package/dist/index-CKYExssR.js +136 -0
  93. package/dist/index-Cz_KLwWf.js +136 -0
  94. package/dist/index-DOgF4dFK.js +24 -0
  95. package/dist/index-DgbQBx6x.js +122 -0
  96. package/dist/index-DxHPjZav.js +136 -0
  97. package/dist/index-m4HTrJ5J.js +135 -0
  98. package/dist/upload-2naN75Zu.js +60 -0
  99. package/dist/upload-Cx71802W.js +60 -0
  100. package/dist/upload-DvAE1vDq.js +60 -0
  101. package/dist/useAndroidServiceAccountTestResult-BDc7XpKE.js +52 -0
  102. package/dist/useAndroidServiceAccountTestResult-B_ekRewZ.js +52 -0
  103. package/dist/useAndroidServiceAccountTestResult-Ce1x0Eh8.js +52 -0
  104. package/dist/useAppleApp-BEtLQa7n.js +32 -0
  105. package/dist/useAppleApp-CApC0-4Q.js +32 -0
  106. package/dist/useAppleApp-CETIcsJS.js +32 -0
  107. package/dist/useAppleBundleId-DXbMDRLd.js +64 -0
  108. package/dist/useAppleBundleId-SmzY6rkm.js +64 -0
  109. package/dist/useAppleBundleId-gPBzJwQg.js +64 -0
  110. package/dist/useJobWatching-BIG6fnTN.js +45 -0
  111. package/dist/useJobWatching-Cp-CYd90.js +45 -0
  112. package/dist/useJobWatching-D-YzSlK8.js +45 -0
  113. package/dist/useProjectCredentials-CKngz2rd.js +54 -0
  114. package/dist/useProjectCredentials-EapDge1I.js +54 -0
  115. package/dist/useProjectCredentials-vjedBbKl.js +54 -0
  116. package/dist/useWebSocket-Bep1zAVG.js +36 -0
  117. package/dist/useWebSocket-CBqsjHbt.js +36 -0
  118. package/dist/useWebSocket-rBLiZsKb.js +36 -0
  119. package/dist/wizard-ChPegnMW.js +133 -0
  120. package/npm-shrinkwrap.json +251 -223
  121. package/oclif.manifest.json +256 -220
  122. 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,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 };
@@ -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, p as getAuthedHeaders, q as API_URL, K as castArrayObjectDates } from './index-Bv3x8c78.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-BDc7XpKE.js';
20
+ import { g as getShortUUID } from './index-BQnkBr1Q.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 };