shipthis 0.1.39 → 0.1.42

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 (94) hide show
  1. package/README.md +58 -0
  2. package/assets/markdown/confirm-change-android-build-method.md.ejs +13 -0
  3. package/dist/{AppleBundleIdDetails-Ck7iAjMb.js → AppleBundleIdDetails-jDq3gYbk.js} +7 -5
  4. package/dist/{Command-C84QiOWP.js → Command-cVo97lkQ.js} +2 -1
  5. package/dist/{CommandGame-CsM9GE5Q.js → CommandGame-BwudtYCO.js} +2 -2
  6. package/dist/{Create-Dx1nEKmS.js → Create-By4NsPEI.js} +3 -1
  7. package/dist/{GameStatus-B4WBgoLs.js → GameStatus-C59zQE1H.js} +3 -1
  8. package/dist/{Import-BC5XgwRT.js → Import-DTcVM-T-.js} +4 -2
  9. package/dist/{JobLogTail-mBXpeWMu.js → JobLogTail-BzisGkY8.js} +30 -16
  10. package/dist/{JobProgress-KZ6EkMFi.js → JobProgress-DAnhaTho.js} +21 -9
  11. package/dist/{JobStatusTable-BYIxTt0d.js → JobStatusTable-BYEi8dtD.js} +3 -2
  12. package/dist/{ProjectCredentialsTable-DSy1YIWX.js → ProjectCredentialsTable-NZf3V39z.js} +2 -2
  13. package/dist/{UserCredentialsTable-qNByRE84.js → UserCredentialsTable-Dp884nYO.js} +2 -1
  14. package/dist/{baseAppleCommand-CdROzhyU.js → baseAppleCommand-DewNWX3L.js} +1 -1
  15. package/dist/baseCommand-CscxrTMI.js +757 -0
  16. package/dist/{baseGameAndroidCommand-B21zS0MN.js → baseGameAndroidCommand-CEcDz5P2.js} +4 -2
  17. package/dist/{index-Cv-92xRd.js → baseGameCommand-BKvHM3h_.js} +19 -755
  18. package/dist/commands/apiKey/create.js +7 -7
  19. package/dist/commands/apiKey/list.js +7 -7
  20. package/dist/commands/apiKey/revoke.js +7 -7
  21. package/dist/commands/apple/apiKey/create.js +14 -14
  22. package/dist/commands/apple/apiKey/delete.js +8 -8
  23. package/dist/commands/apple/apiKey/export.js +14 -14
  24. package/dist/commands/apple/apiKey/import.js +14 -14
  25. package/dist/commands/apple/apiKey/status.js +13 -13
  26. package/dist/commands/apple/certificate/create.js +14 -14
  27. package/dist/commands/apple/certificate/delete.js +8 -8
  28. package/dist/commands/apple/certificate/export.js +14 -14
  29. package/dist/commands/apple/certificate/import.js +14 -14
  30. package/dist/commands/apple/certificate/status.js +13 -13
  31. package/dist/commands/apple/login.js +5 -5
  32. package/dist/commands/apple/status.js +13 -13
  33. package/dist/commands/dashboard.js +8 -8
  34. package/dist/commands/game/android/apiKey/connect.js +12 -12
  35. package/dist/commands/game/android/apiKey/create.js +14 -14
  36. package/dist/commands/game/android/apiKey/delete.js +7 -7
  37. package/dist/commands/game/android/apiKey/export.js +14 -14
  38. package/dist/commands/game/android/apiKey/import.js +14 -14
  39. package/dist/commands/game/android/apiKey/invite.js +20 -20
  40. package/dist/commands/game/android/apiKey/policy.js +9 -9
  41. package/dist/commands/game/android/apiKey/status.js +14 -14
  42. package/dist/commands/game/android/keyStore/create.js +11 -11
  43. package/dist/commands/game/android/keyStore/delete.js +7 -7
  44. package/dist/commands/game/android/keyStore/export.js +13 -13
  45. package/dist/commands/game/android/keyStore/import.js +16 -16
  46. package/dist/commands/game/android/keyStore/status.js +16 -16
  47. package/dist/commands/game/android/status.js +6 -6
  48. package/dist/commands/game/build/download.js +7 -7
  49. package/dist/commands/game/build/list.js +12 -12
  50. package/dist/commands/game/create.js +5 -5
  51. package/dist/commands/game/details.js +16 -13
  52. package/dist/commands/game/export.js +5 -5
  53. package/dist/commands/game/ios/app/addTester.js +9 -9
  54. package/dist/commands/game/ios/app/create.js +10 -9
  55. package/dist/commands/game/ios/app/status.js +14 -14
  56. package/dist/commands/game/ios/app/sync.js +12 -12
  57. package/dist/commands/game/ios/profile/create.js +10 -10
  58. package/dist/commands/game/ios/profile/delete.js +8 -8
  59. package/dist/commands/game/ios/profile/export.js +13 -13
  60. package/dist/commands/game/ios/profile/import.js +13 -13
  61. package/dist/commands/game/ios/profile/status.js +14 -14
  62. package/dist/commands/game/ios/status.js +18 -18
  63. package/dist/commands/game/ios/wizard.js +8 -8
  64. package/dist/commands/game/job/list.js +7 -7
  65. package/dist/commands/game/job/status.js +14 -14
  66. package/dist/commands/game/list.js +7 -7
  67. package/dist/commands/game/ship.js +30 -13
  68. package/dist/commands/game/status.js +14 -14
  69. package/dist/commands/game/wizard.js +87 -37
  70. package/dist/commands/internal/fastlane.js +13 -13
  71. package/dist/commands/internal/readme.js +17 -17
  72. package/dist/commands/login.js +21 -21
  73. package/dist/commands/status.js +10 -10
  74. package/dist/commands/util/android-build-method.js +66 -0
  75. package/dist/commands/util/glass.js +118 -0
  76. package/dist/{export-BtUjg3Tl.js → export-DBQHSKU-.js} +1 -1
  77. package/dist/{import-BYSkF-tX.js → import-Bk4w8kks.js} +1 -1
  78. package/dist/{index-CcGRePRU.js → index-WrVwh6le.js} +6 -4
  79. package/dist/{index-Du6l7ZyV.js → index-qOGviaGc.js} +1 -1
  80. package/dist/{index-CgGLBt2v.js → index-zdIBXHs2.js} +5 -3
  81. package/dist/{upload-LoVBuJbT.js → upload-CeRPHRCP.js} +1 -1
  82. package/dist/{useAppleApp-Bg0x6s97.js → useAppleApp-DgZH0CBS.js} +1 -1
  83. package/dist/{useAppleBundleId-CEOssLqN.js → useAppleBundleId-CA7Pg4Hi.js} +2 -2
  84. package/dist/{useAppleProfiles-CHf_gHdZ.js → useAppleProfiles-CUBTPbcC.js} +1 -1
  85. package/dist/{useGoogleStatus-Ch36GbVo.js → useGoogleStatus-DpPwKmw_.js} +2 -1
  86. package/dist/{useProjectCredentials-CsQWPdyo.js → useProjectCredentials-rQLm2O1J.js} +2 -1
  87. package/dist/{useWebSocket-CWeaaLqi.js → useWebSocket-PU55rRGt.js} +1 -1
  88. package/docs/README.md +1 -0
  89. package/docs/util/android-build-method.md +26 -0
  90. package/docs/util/glass.md +47 -0
  91. package/docs/util.md +12 -0
  92. package/npm-shrinkwrap.json +14181 -0
  93. package/oclif.manifest.json +2966 -0
  94. package/package.json +11 -6
@@ -1,54 +1,54 @@
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 { X as queryClient, a0 as cacheKeys, u as getAuthedHeaders, t as API_URL, V as castArrayObjectDates, S as CommandContext, R as GameContext, p as getProject, aC as updateProject, y as getGodotVersion, x as GameEngine, z as createProject, E as DEFAULT_SHIPPED_FILES_GLOBS, F as DEFAULT_IGNORED_FILES_GLOBS, aq as useBuilds, P as Platform, M as JobStatus, au as Markdown, W as WEB_URL, g as getShortUUID, at as useSafeInput, C as CredentialsType, a2 as getGoogleStatus, aD as queryBuilds, a6 as fetchKeyTestResult, a8 as KeyTestStatus, a9 as KeyTestError, Z as GameProvider, aE as CreateGooglePlayGame, B as BaseAuthenticatedCommand, o as isCWDGodotGame } from '../../index-Cv-92xRd.js';
5
- import { Box, Text } from 'ink';
6
- import Spinner from 'ink-spinner';
7
- import 'node:crypto';
4
+ import { k as cacheKeys, j as CommandContext, i as GameContext, v as useBuilds, M as Markdown, g as getShortUUID, x as useSafeInput, z as queryBuilds, n as fetchKeyTestResult, K as KeyTestStatus, p as KeyTestError, G as GameProvider, A as CreateGooglePlayGame, B as BaseAuthenticatedCommand } from '../../baseGameCommand-BKvHM3h_.js';
8
5
  import fs__default from 'node:fs';
9
6
  import 'node:path';
7
+ import 'chalk';
8
+ import axios from 'axios';
9
+ import 'crypto-js';
10
+ import 'uuid';
11
+ import { I as queryClient, q as getAuthedHeaders, p as API_URL, H as castArrayObjectDates, l as getProject, aa as updateProject, v as getGodotVersion, u as GameEngine, w as createProject, x as DEFAULT_SHIPPED_FILES_GLOBS, y as DEFAULT_IGNORED_FILES_GLOBS, P as Platform, ab as BuildType, J as JobStatus, W as WEB_URL, ac as getGradleBuildOptionKey, i as isGradleBuildEnabled, s as setGradleBuildEnabled, C as CredentialsType, O as getGoogleStatus, k as isCWDGodotGame } from '../../baseCommand-CscxrTMI.js';
12
+ import 'luxon';
13
+ import 'node:crypto';
10
14
  import 'node:readline';
11
15
  import 'node:url';
12
16
  import 'readline-sync';
13
- import 'luxon';
14
- import axios from 'axios';
15
17
  import 'isomorphic-git';
16
18
  import { useMutation, useQuery } from '@tanstack/react-query';
17
19
  import React, { useState, useContext, useEffect, useRef } from 'react';
18
- import 'crypto-js';
19
- import 'uuid';
20
20
  import 'fast-glob';
21
21
  import 'yazl';
22
22
  import 'socket.io-client';
23
+ import { Box, Text } from 'ink';
24
+ import Spinner from 'ink-spinner';
23
25
  import 'string-length';
24
26
  import 'strip-ansi';
25
27
  import 'open';
26
- import { C as ConnectGoogle } from '../../index-CgGLBt2v.js';
28
+ import { C as ConnectGoogle } from '../../index-zdIBXHs2.js';
27
29
  import { TextInput, Alert } from '@inkjs/ui';
28
30
  import 'marked';
29
31
  import 'marked-terminal';
30
32
  import 'qrcode';
31
- import { J as JobLogTail } from '../../JobLogTail-mBXpeWMu.js';
32
- import { u as useShip, J as JobProgress } from '../../JobProgress-KZ6EkMFi.js';
33
- import { C as CreateServiceAccountKey } from '../../index-CcGRePRU.js';
34
- import { C as CreateKeystore } from '../../Create-Dx1nEKmS.js';
35
- import { I as ImportKeystore } from '../../Import-BC5XgwRT.js';
36
- import { a as getProjectCredentials } from '../../index-Du6l7ZyV.js';
33
+ import { getMajorVersion } from 'godot-export-presets';
34
+ import { J as JobLogTail } from '../../JobLogTail-BzisGkY8.js';
35
+ import { u as useShip, J as JobProgress } from '../../JobProgress-DAnhaTho.js';
36
+ import { C as CreateServiceAccountKey } from '../../index-WrVwh6le.js';
37
+ import { C as CreateKeystore } from '../../Create-By4NsPEI.js';
38
+ import { I as ImportKeystore } from '../../Import-DTcVM-T-.js';
39
+ import { a as getProjectCredentials } from '../../index-qOGviaGc.js';
37
40
  import { T as Title } from '../../Title-BCQtayg6.js';
38
- import { C as Command } from '../../Command-C84QiOWP.js';
39
- import 'chalk';
40
- import '@expo/apple-utils/build/index.js';
41
- import 'deepmerge';
42
- import 'ini';
41
+ import { C as Command } from '../../Command-cVo97lkQ.js';
43
42
  import 'fs';
44
43
  import 'path';
45
- import '../../useGoogleStatus-Ch36GbVo.js';
46
- import '../../useWebSocket-CWeaaLqi.js';
44
+ import '@expo/apple-utils/build/index.js';
45
+ import '../../useGoogleStatus-DpPwKmw_.js';
46
+ import '../../useWebSocket-PU55rRGt.js';
47
47
  import '../../git-BpsfNFZ_.js';
48
48
  import '../../ProgressSpinner-Um6ARKlk.js';
49
- import '../../useProjectCredentials-CsQWPdyo.js';
49
+ import '../../useProjectCredentials-rQLm2O1J.js';
50
50
  import '../../RunWithSpinner-DucRnFp6.js';
51
- import '../../import-BYSkF-tX.js';
51
+ import '../../import-Bk4w8kks.js';
52
52
 
53
53
  const useInviteServiceAccount = () => useMutation({
54
54
  async mutationFn({ developerId, projectId }) {
@@ -247,11 +247,7 @@ const CreateGame = (props) => {
247
247
  ] });
248
248
  };
249
249
 
250
- const CreateInitialBuild = (props) => {
251
- const { gameId } = useContext(GameContext);
252
- return /* @__PURE__ */ jsx(Fragment, { children: gameId && /* @__PURE__ */ jsx(CreateForGame, { gameId, ...props }) });
253
- };
254
- const CreateForGame = ({ gameId, onComplete, onError, ...boxProps }) => {
250
+ const InitialAndroidBuild = ({ gameId, onComplete, onError, ...boxProps }) => {
255
251
  const { command } = useContext(CommandContext);
256
252
  const { data: buildData, isLoading: isLoadingBuilds } = useBuilds({ pageNumber: 0, projectId: gameId });
257
253
  const { data: jobData, isLoading: isLoadingJobs } = useJobs({
@@ -267,7 +263,9 @@ const CreateForGame = ({ gameId, onComplete, onError, ...boxProps }) => {
267
263
  if (!buildData) return;
268
264
  if (!jobData) return;
269
265
  if (!command) return;
270
- const hasAndroidBuild = buildData.data.some((build) => build.platform === Platform.ANDROID);
266
+ const hasAndroidBuild = buildData.data.some(
267
+ (build) => build.platform === Platform.ANDROID && build.buildType == BuildType.AAB
268
+ );
271
269
  if (!prevHasBuild.current && hasAndroidBuild) return onComplete();
272
270
  prevHasBuild.current = hasAndroidBuild;
273
271
  const hasRunningAndroidJob = jobData.data.some(
@@ -293,12 +291,19 @@ const CreateForGame = ({ gameId, onComplete, onError, ...boxProps }) => {
293
291
  (isLoadingBuilds || isLoadingJobs || shipMutation.isPending) && /* @__PURE__ */ jsx(Spinner, { type: "dots" })
294
292
  ] }),
295
293
  androidJob === null && /* @__PURE__ */ jsx(Text, { children: shipLog }),
296
- androidJob && /* @__PURE__ */ jsx(JobProgress, { job: androidJob, onComplete, onFailure: (j) => {
297
- setFailedJob(j);
298
- setTimeout(() => {
299
- onError(new Error(`Job ${j.id} failed`));
300
- }, 1e3);
301
- } }),
294
+ androidJob && /* @__PURE__ */ jsx(
295
+ JobProgress,
296
+ {
297
+ job: androidJob,
298
+ onComplete,
299
+ onFailure: (j) => {
300
+ setFailedJob(j);
301
+ setTimeout(() => {
302
+ onError(new Error(`Job ${j.id} failed`));
303
+ }, 1e3);
304
+ }
305
+ }
306
+ ),
302
307
  failedJob && /* @__PURE__ */ jsxs(Fragment, { children: [
303
308
  /* @__PURE__ */ jsx(
304
309
  Markdown,
@@ -314,6 +319,49 @@ const CreateForGame = ({ gameId, onComplete, onError, ...boxProps }) => {
314
319
  ] }) });
315
320
  };
316
321
 
322
+ const EnableGradle = ({ onConfirm, onCancel, ...boxProps }) => {
323
+ const godotVersion = getGodotVersion();
324
+ const majorVersion = getMajorVersion(godotVersion);
325
+ useSafeInput(async (input) => {
326
+ if (input == "y") return onConfirm && onConfirm();
327
+ if (input == "n") return onCancel && onCancel();
328
+ });
329
+ return /* @__PURE__ */ jsx(Box, { flexDirection: "column", gap: 1, ...boxProps, children: /* @__PURE__ */ jsx(Box, { flexDirection: "row", gap: 1, children: /* @__PURE__ */ jsx(
330
+ Markdown,
331
+ {
332
+ filename: "confirm-change-android-build-method.md.ejs",
333
+ templateVars: {
334
+ docsURL: `${WEB_URL}docs/guides/android-build-methods`,
335
+ godotVersion,
336
+ optionKey: getGradleBuildOptionKey(majorVersion)
337
+ }
338
+ }
339
+ ) }) });
340
+ };
341
+
342
+ const CreateInitialBuild = ({ onComplete, onError, ...boxProps }) => {
343
+ const { gameId } = useContext(GameContext);
344
+ const [canBuildAAB, setCanBuildAAB] = useState(null);
345
+ useEffect(() => {
346
+ async function fetchBuildMethod() {
347
+ const isGradle = await isGradleBuildEnabled();
348
+ setCanBuildAAB(isGradle);
349
+ }
350
+ fetchBuildMethod();
351
+ }, []);
352
+ const updateBuildMethod = async () => {
353
+ await setGradleBuildEnabled(true);
354
+ setCanBuildAAB(true);
355
+ };
356
+ if (canBuildAAB === null) {
357
+ return /* @__PURE__ */ jsx(Text, { children: "Loading..." });
358
+ }
359
+ if (canBuildAAB === false) {
360
+ return /* @__PURE__ */ jsx(EnableGradle, { ...boxProps, onConfirm: () => updateBuildMethod(), onCancel: () => process.exit() });
361
+ }
362
+ return /* @__PURE__ */ jsx(Fragment, { children: gameId && /* @__PURE__ */ jsx(InitialAndroidBuild, { gameId, onComplete, onError, ...boxProps }) });
363
+ };
364
+
317
365
  const InviteForm = ({ onSubmit }) => {
318
366
  const [error, setError] = useState(null);
319
367
  const [accountId, setAccountId] = useState("");
@@ -520,7 +568,9 @@ const getStatusFlags = async (cmd) => {
520
568
  (cred) => cred.isActive && cred.platform === Platform.ANDROID && cred.type === CredentialsType.KEY
521
569
  );
522
570
  const buildsResponse = projectId && hasShipThisProject ? await queryBuilds({ pageNumber: 0, projectId: `${projectId}` }) : null;
523
- const hasInitialBuild = Boolean(buildsResponse?.data?.some((build) => build.platform === Platform.ANDROID));
571
+ const hasInitialBuild = Boolean(
572
+ buildsResponse?.data?.some((build) => build.platform === Platform.ANDROID && build.buildType === BuildType.AAB)
573
+ );
524
574
  const testResult = projectId ? await fetchKeyTestResult({ projectId }) : null;
525
575
  const hasGooglePlayGame = testResult && testResult?.status === KeyTestStatus.SUCCESS || testResult?.status === KeyTestStatus.ERROR && testResult?.error === KeyTestError.NOT_INVITED;
526
576
  const hasInvitedServiceAccount = testResult ? testResult?.status === KeyTestStatus.SUCCESS : false;
@@ -1,38 +1,38 @@
1
1
  import fs__default, { promises } from 'node:fs';
2
- import path from 'node:path';
2
+ import path__default from 'node:path';
3
3
  import { Args, Flags } from '@oclif/core';
4
- import { ac as BaseCommand } from '../../index-Cv-92xRd.js';
5
4
  import 'axios';
6
5
  import 'crypto-js';
7
6
  import 'uuid';
7
+ import { B as BaseCommand } from '../../baseCommand-CscxrTMI.js';
8
8
  import 'luxon';
9
- import 'chalk';
10
- import '@expo/apple-utils/build/index.js';
9
+ import 'react/jsx-runtime';
10
+ import 'ink';
11
+ import 'ink-spinner';
11
12
  import 'node:crypto';
12
13
  import 'node:readline';
13
14
  import 'node:url';
14
15
  import 'readline-sync';
15
16
  import 'isomorphic-git';
16
- import 'deepmerge';
17
- import 'ini';
18
17
  import '@tanstack/react-query';
19
18
  import 'react';
20
19
  import 'fast-glob';
21
20
  import 'yazl';
22
21
  import 'socket.io-client';
23
22
  import 'fullscreen-ink';
24
- import 'ink';
25
- import 'react/jsx-runtime';
26
- import 'ink-spinner';
27
23
  import 'string-length';
28
24
  import 'strip-ansi';
29
25
  import 'open';
30
26
  import '@inkjs/ui';
31
- import 'fs';
32
- import 'path';
27
+ import '../../baseGameCommand-BKvHM3h_.js';
33
28
  import 'marked';
34
29
  import 'marked-terminal';
35
30
  import 'qrcode';
31
+ import 'godot-export-presets';
32
+ import 'chalk';
33
+ import '@expo/apple-utils/build/index.js';
34
+ import 'fs';
35
+ import 'path';
36
36
 
37
37
  function generateFastlaneSession(cookieData) {
38
38
  return cookieData.cookies.map((cookie) => `- !ruby/object:HTTP::Cookie
@@ -65,7 +65,7 @@ class AppleFastlane extends BaseCommand {
65
65
  const { args } = this;
66
66
  const { file, username } = args;
67
67
  const homeDirectory = this.config.home;
68
- const inputFilePath = path.join(homeDirectory, ".app-store", "auth", username, "cookie");
68
+ const inputFilePath = path__default.join(homeDirectory, ".app-store", "auth", username, "cookie");
69
69
  if (!fs__default.existsSync(inputFilePath)) {
70
70
  throw new Error(`No expo auth file found for ${username}`);
71
71
  }
@@ -76,7 +76,7 @@ class AppleFastlane extends BaseCommand {
76
76
  const fileContent = await promises.readFile(inputFilePath, "utf8");
77
77
  const cookieData = JSON.parse(fileContent);
78
78
  const yamlContent = generateFastlaneSession(cookieData);
79
- await promises.mkdir(path.dirname(outputFilePath), { recursive: true });
79
+ await promises.mkdir(path__default.dirname(outputFilePath), { recursive: true });
80
80
  await promises.writeFile(outputFilePath, yamlContent, "utf-8");
81
81
  console.log(`FASTLANE_SESSION written to ${outputFilePath}`);
82
82
  }
@@ -1,39 +1,39 @@
1
1
  import fs__default from 'node:fs';
2
- import path from 'node:path';
2
+ import path__default from 'node:path';
3
3
  import { Args, Flags } from '@oclif/core';
4
- import { ac as BaseCommand, ad as ejs } from '../../index-Cv-92xRd.js';
5
- import CustomHelp from '../../utils/help.js';
4
+ import { q as ejs } from '../../baseGameCommand-BKvHM3h_.js';
6
5
  import 'axios';
7
6
  import 'crypto-js';
8
7
  import 'uuid';
8
+ import { B as BaseCommand } from '../../baseCommand-CscxrTMI.js';
9
9
  import 'luxon';
10
- import 'chalk';
11
- import '@expo/apple-utils/build/index.js';
10
+ import 'react/jsx-runtime';
11
+ import 'ink';
12
+ import 'ink-spinner';
12
13
  import 'node:crypto';
13
14
  import 'node:readline';
14
15
  import 'node:url';
15
16
  import 'readline-sync';
16
17
  import 'isomorphic-git';
17
- import 'deepmerge';
18
- import 'ini';
18
+ import CustomHelp from '../../utils/help.js';
19
19
  import '@tanstack/react-query';
20
20
  import 'react';
21
21
  import 'fast-glob';
22
22
  import 'yazl';
23
23
  import 'socket.io-client';
24
24
  import 'fullscreen-ink';
25
- import 'ink';
26
- import 'react/jsx-runtime';
27
- import 'ink-spinner';
28
25
  import 'string-length';
29
26
  import 'strip-ansi';
30
27
  import 'open';
31
28
  import '@inkjs/ui';
32
- import 'fs';
33
- import 'path';
34
29
  import 'marked';
35
30
  import 'marked-terminal';
36
31
  import 'qrcode';
32
+ import 'godot-export-presets';
33
+ import 'fs';
34
+ import 'path';
35
+ import 'chalk';
36
+ import '@expo/apple-utils/build/index.js';
37
37
 
38
38
  const ROOT_TOPIC_NAME = "shipthis";
39
39
  const ROOT_TOPIC_DESCRIPTION = "Root topic";
@@ -133,7 +133,7 @@ function getTopicTree(topics, commands, separateFileDepth) {
133
133
  const includeTopicsAndCommands = currentParent.includeTopicsAndCommands || currentDepth >= separateFileDepth;
134
134
  const newSubTopic = {
135
135
  commands: [],
136
- filePath: `${path.join(...name.split(":"))}.md`,
136
+ filePath: `${path__default.join(...name.split(":"))}.md`,
137
137
  includeTopicsAndCommands,
138
138
  subTopics: [],
139
139
  topic: topicsByName[name]
@@ -153,7 +153,7 @@ function getTopicTree(topics, commands, separateFileDepth) {
153
153
  if (!subTopic) throw new Error("Could not find topic for command: " + command.id);
154
154
  currentParent = subTopic;
155
155
  }
156
- currentParent.commands.push({ command, filePath: `${path.join(...command.id.split(":"))}.md` });
156
+ currentParent.commands.push({ command, filePath: `${path__default.join(...command.id.split(":"))}.md` });
157
157
  }
158
158
  return topicTree;
159
159
  }
@@ -184,13 +184,13 @@ function writeTopic(topic, outputDir, dryRun, overWrite, only) {
184
184
  outputList.push(filePath2);
185
185
  const doWrite = !exists || overWrite;
186
186
  if (!doWrite || dryRun) return;
187
- const folder = path.dirname(filePath2);
187
+ const folder = path__default.dirname(filePath2);
188
188
  fs__default.mkdirSync(folder, { recursive: true });
189
189
  fs__default.writeFileSync(filePath2, rendered);
190
190
  };
191
191
  const skipFile = (filePath2) => only && !filePath2.match(only);
192
192
  const writeOutput = { created: [], overwritten: [] };
193
- const filePath = path.join(outputDir, topic.filePath);
193
+ const filePath = path__default.join(outputDir, topic.filePath);
194
194
  if (!skipFile(filePath)) makeFolderAndSave(filePath, topic.rendered);
195
195
  for (const subTopic of topic.subTopics) {
196
196
  const subWriteOutput = writeTopic(subTopic, outputDir, dryRun, overWrite, only);
@@ -199,7 +199,7 @@ function writeTopic(topic, outputDir, dryRun, overWrite, only) {
199
199
  }
200
200
  for (const command of topic.commands) {
201
201
  if (!command.renderedForFile) throw new Error(`Command ${command.command.id} has not been rendered`);
202
- const filePath2 = path.join(outputDir, command.filePath);
202
+ const filePath2 = path__default.join(outputDir, command.filePath);
203
203
  if (!skipFile(filePath2)) makeFolderAndSave(filePath2, command.renderedForFile);
204
204
  }
205
205
  return writeOutput;
@@ -1,38 +1,38 @@
1
1
  import { Flags } from '@oclif/core';
2
2
  import axios from 'axios';
3
- import { W as WEB_URL, ac as BaseCommand, ai as acceptTerms, t as API_URL, aj as setAuthToken, c as getInput } from '../index-Cv-92xRd.js';
4
- import 'node:fs';
5
- import 'crypto-js';
6
- import 'uuid';
7
- import 'luxon';
8
- import 'node:path';
9
- import 'chalk';
10
- import '@expo/apple-utils/build/index.js';
11
- import 'node:crypto';
12
- import 'node:readline';
13
- import 'node:url';
14
- import 'readline-sync';
15
- import 'isomorphic-git';
16
- import 'deepmerge';
17
- import 'ini';
18
- import '@tanstack/react-query';
3
+ import { W as WEB_URL, B as BaseCommand, $ as acceptTerms, p as API_URL, a0 as setAuthToken } from '../baseCommand-CscxrTMI.js';
4
+ import 'react/jsx-runtime';
5
+ import 'ink';
6
+ import 'ink-spinner';
7
+ import { b as getInput } from '../baseGameCommand-BKvHM3h_.js';
19
8
  import 'react';
9
+ import '@tanstack/react-query';
10
+ import 'luxon';
11
+ import 'node:fs';
20
12
  import 'fast-glob';
13
+ import 'uuid';
21
14
  import 'yazl';
22
15
  import 'socket.io-client';
23
16
  import 'fullscreen-ink';
24
- import 'ink';
25
- import 'react/jsx-runtime';
26
- import 'ink-spinner';
27
17
  import 'string-length';
28
18
  import 'strip-ansi';
29
19
  import 'open';
30
20
  import '@inkjs/ui';
31
- import 'fs';
32
- import 'path';
21
+ import 'node:path';
33
22
  import 'marked';
34
23
  import 'marked-terminal';
35
24
  import 'qrcode';
25
+ import 'godot-export-presets';
26
+ import 'chalk';
27
+ import 'crypto-js';
28
+ import '@expo/apple-utils/build/index.js';
29
+ import 'node:crypto';
30
+ import 'node:readline';
31
+ import 'node:url';
32
+ import 'readline-sync';
33
+ import 'isomorphic-git';
34
+ import 'fs';
35
+ import 'path';
36
36
 
37
37
  const TERMS_URL = new URL("/terms", WEB_URL).href;
38
38
  const PRIVACY_URL = new URL("/privacy", WEB_URL).href;
@@ -1,21 +1,21 @@
1
1
  import { jsxs, jsx } from 'react/jsx-runtime';
2
2
  import { render } from 'ink';
3
- import { ac as BaseCommand, o as isCWDGodotGame } from '../index-Cv-92xRd.js';
3
+ import 'node:fs';
4
+ import 'axios';
5
+ import 'crypto-js';
6
+ import 'uuid';
7
+ import { B as BaseCommand, k as isCWDGodotGame } from '../baseCommand-CscxrTMI.js';
8
+ import 'luxon';
4
9
  import 'ink-spinner';
5
10
  import 'node:crypto';
6
- import 'node:fs';
7
11
  import 'node:path';
8
12
  import 'node:readline';
9
13
  import 'node:url';
10
14
  import 'readline-sync';
11
- import 'luxon';
12
- import 'axios';
13
15
  import { i as isCWDGitRepo } from '../git-BpsfNFZ_.js';
14
16
  import '@oclif/core';
15
17
  import '@tanstack/react-query';
16
18
  import 'react';
17
- import 'crypto-js';
18
- import 'uuid';
19
19
  import 'fast-glob';
20
20
  import 'yazl';
21
21
  import 'socket.io-client';
@@ -25,19 +25,19 @@ import 'strip-ansi';
25
25
  import { S as StatusTable } from '../StatusTable-DzRWcMr4.js';
26
26
  import 'open';
27
27
  import '@inkjs/ui';
28
+ import '../baseGameCommand-BKvHM3h_.js';
28
29
  import 'marked';
29
30
  import 'marked-terminal';
30
31
  import { N as NextSteps } from '../NextSteps-DbJHmscQ.js';
31
32
  import 'qrcode';
32
- import { C as Command } from '../Command-C84QiOWP.js';
33
+ import 'godot-export-presets';
34
+ import { C as Command } from '../Command-cVo97lkQ.js';
33
35
  import chalk from 'chalk';
34
36
  import '@expo/apple-utils/build/index.js';
35
37
  import 'isomorphic-git';
36
- import 'deepmerge';
37
- import 'ini';
38
+ import '../Title-BCQtayg6.js';
38
39
  import 'fs';
39
40
  import 'path';
40
- import '../Title-BCQtayg6.js';
41
41
 
42
42
  class Status extends BaseCommand {
43
43
  static args = {};
@@ -0,0 +1,66 @@
1
+ import { Flags } from '@oclif/core';
2
+ import 'node:fs';
3
+ import 'axios';
4
+ import 'crypto-js';
5
+ import 'uuid';
6
+ import { B as BaseCommand, i as isGradleBuildEnabled, s as setGradleBuildEnabled } from '../../baseCommand-CscxrTMI.js';
7
+ import 'luxon';
8
+ import 'react/jsx-runtime';
9
+ import 'ink';
10
+ import 'ink-spinner';
11
+ import 'node:crypto';
12
+ import 'node:path';
13
+ import 'node:readline';
14
+ import 'node:url';
15
+ import 'readline-sync';
16
+ import 'isomorphic-git';
17
+ import '@tanstack/react-query';
18
+ import 'react';
19
+ import 'fast-glob';
20
+ import 'yazl';
21
+ import 'socket.io-client';
22
+ import 'fullscreen-ink';
23
+ import 'string-length';
24
+ import 'strip-ansi';
25
+ import 'open';
26
+ import '@inkjs/ui';
27
+ import '../../baseGameCommand-BKvHM3h_.js';
28
+ import 'marked';
29
+ import 'marked-terminal';
30
+ import 'qrcode';
31
+ import 'godot-export-presets';
32
+ import 'chalk';
33
+ import '@expo/apple-utils/build/index.js';
34
+ import 'fs';
35
+ import 'path';
36
+
37
+ class UtilAndroidBuildMethod extends BaseCommand {
38
+ static args = {};
39
+ static description = "Gets and sets the Android build method in export_presets.cfg";
40
+ static examples = [
41
+ "<%= config.bin %> <%= command.id %>",
42
+ "<%= config.bin %> <%= command.id %> --legacy",
43
+ "<%= config.bin %> <%= command.id %> --gradle"
44
+ ];
45
+ static flags = {
46
+ legacy: Flags.boolean({ char: "l", description: "use legacy build method" }),
47
+ gradle: Flags.boolean({ char: "g", description: "use gradle build method" })
48
+ };
49
+ async run() {
50
+ const { flags } = await this.parse(UtilAndroidBuildMethod);
51
+ if (flags.legacy && flags.gradle) {
52
+ this.error("Cannot use both --legacy and --gradle flags together");
53
+ }
54
+ if (!flags.legacy && !flags.gradle) {
55
+ const buildMethod2 = await isGradleBuildEnabled() ? "gradle" : "legacy";
56
+ this.log(`Current Android build method: ${buildMethod2}`);
57
+ return;
58
+ }
59
+ const isGradle = flags.gradle ? true : false;
60
+ const buildMethod = flags.legacy ? "legacy" : "gradle";
61
+ this.log(`Setting Android build method to: ${buildMethod}`);
62
+ await setGradleBuildEnabled(isGradle);
63
+ }
64
+ }
65
+
66
+ export { UtilAndroidBuildMethod as default };
@@ -0,0 +1,118 @@
1
+ import { B as BaseCommand } from '../../baseCommand-CscxrTMI.js';
2
+ import { Flags, Args } from '@oclif/core';
3
+ import * as fs from 'node:fs';
4
+ import * as path from 'node:path';
5
+ import xcode from 'xcode';
6
+ import 'chalk';
7
+ import 'axios';
8
+ import 'crypto-js';
9
+ import 'uuid';
10
+ import 'luxon';
11
+ import '@expo/apple-utils/build/index.js';
12
+ import 'node:crypto';
13
+ import 'node:readline';
14
+ import 'node:url';
15
+ import 'readline-sync';
16
+ import 'isomorphic-git';
17
+ import 'godot-export-presets';
18
+ import '@tanstack/react-query';
19
+ import 'react';
20
+ import 'fast-glob';
21
+ import 'yazl';
22
+ import 'socket.io-client';
23
+ import 'fullscreen-ink';
24
+ import 'ink';
25
+
26
+ async function applyLiquidGlassIcon(opts) {
27
+ const { projectDir, iconDir, verbose } = opts;
28
+ const info = (msg) => {
29
+ if (!verbose) return;
30
+ console.log(msg);
31
+ };
32
+ const warn = (msg) => console.warn(`Warning: ${msg}`);
33
+ info(`Applying Liquid Glass icon from: ${iconDir}`);
34
+ if (!fs.existsSync(projectDir)) {
35
+ throw new Error(`projectDir not found: ${projectDir}`);
36
+ }
37
+ const pbxprojPath = path.join(projectDir, "project.pbxproj");
38
+ if (!fs.existsSync(pbxprojPath)) {
39
+ throw new Error(`project.pbxproj not found at: ${pbxprojPath}`);
40
+ }
41
+ if (!fs.existsSync(iconDir)) {
42
+ throw new Error(`Icon directory not found: ${iconDir}`);
43
+ }
44
+ const iconFolderName = path.basename(iconDir);
45
+ const appIconName = iconFolderName.replace(/\.icon$/i, "");
46
+ info(`Detected .icon folder: ${iconFolderName}`);
47
+ info(`Derived app icon name: ${appIconName}`);
48
+ const projectRoot = path.dirname(projectDir);
49
+ const destIconDir = path.join(projectRoot, iconFolderName);
50
+ if (!fs.existsSync(destIconDir)) {
51
+ info(`Copying .icon folder into project root: ${destIconDir}`);
52
+ await fs.promises.cp(iconDir, destIconDir, {
53
+ recursive: true
54
+ });
55
+ } else {
56
+ info(`Icon folder already exists in project root, skipping copy.`);
57
+ }
58
+ const project = xcode.project(pbxprojPath);
59
+ project.parseSync();
60
+ info(`Adding folder reference to Copy Bundle Resources: ${iconFolderName}`);
61
+ const firstProject = project.getFirstProject();
62
+ const mainGroupId = firstProject.firstProject.mainGroup;
63
+ const mainGroup = project.getPBXGroupByKey(mainGroupId);
64
+ const fileRef = project.addResourceFile(
65
+ iconFolderName,
66
+ { lastKnownFileType: "folder.iconcomposer.icon" },
67
+ mainGroup.name
68
+ );
69
+ if (fileRef) {
70
+ project.addToPbxResourcesBuildPhase(fileRef);
71
+ } else {
72
+ warn(`Folder reference may already exist in project: ${iconFolderName}`);
73
+ }
74
+ const configs = project.pbxXCBuildConfigurationSection();
75
+ let modified = 0;
76
+ info(`Updating build settings for app icon: ${appIconName}`);
77
+ for (const key in configs) {
78
+ const cfg = configs[key];
79
+ if (!cfg || typeof cfg !== "object" || !cfg.buildSettings) continue;
80
+ cfg.buildSettings["ASSETCATALOG_COMPILER_APPICON_NAME"] = appIconName;
81
+ cfg.buildSettings["ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS"] = "YES";
82
+ modified++;
83
+ }
84
+ info(`Modified ${modified} build configurations`);
85
+ info(`Writing updated project to ${pbxprojPath}`);
86
+ fs.writeFileSync(pbxprojPath, project.writeSync());
87
+ info(`Liquid Glass icon successfully applied.`);
88
+ }
89
+ class InternalGlass extends BaseCommand {
90
+ static description = "Apply a Liquid Glass .icon folder to a local Xcode project";
91
+ static flags = {
92
+ verbose: Flags.boolean({
93
+ default: false,
94
+ description: "Enable verbose logging"
95
+ })
96
+ };
97
+ static args = {
98
+ project: Args.string({
99
+ description: "Path to the .xcodeproj directory",
100
+ required: true
101
+ }),
102
+ icon: Args.string({
103
+ description: "Path to the .icon folder",
104
+ required: true
105
+ })
106
+ };
107
+ async run() {
108
+ const { args, flags } = await this.parse(InternalGlass);
109
+ await applyLiquidGlassIcon({
110
+ projectDir: args.project,
111
+ iconDir: args.icon,
112
+ verbose: flags.verbose
113
+ });
114
+ this.log("Liquid Glass icon applied.");
115
+ }
116
+ }
117
+
118
+ export { applyLiquidGlassIcon, InternalGlass as default };
@@ -1,6 +1,6 @@
1
1
  import * as fs from 'node:fs';
2
2
  import axios from 'axios';
3
- import { t as API_URL, u as getAuthedHeaders } from './index-Cv-92xRd.js';
3
+ import { p as API_URL, q as getAuthedHeaders } from './baseCommand-CscxrTMI.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 { t as API_URL, u as getAuthedHeaders } from './index-Cv-92xRd.js';
3
+ import { p as API_URL, q as getAuthedHeaders } from './baseCommand-CscxrTMI.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`;