shipthis 0.1.39 → 0.1.41

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 (89) hide show
  1. package/README.md +57 -0
  2. package/dist/{AppleBundleIdDetails-Ck7iAjMb.js → AppleBundleIdDetails-BJC7GCx_.js} +4 -3
  3. package/dist/{Command-C84QiOWP.js → Command-Cj6F5B5a.js} +2 -1
  4. package/dist/{CommandGame-CsM9GE5Q.js → CommandGame-CuvuH-z6.js} +2 -2
  5. package/dist/{Create-Dx1nEKmS.js → Create-pfGYcKu4.js} +2 -1
  6. package/dist/{GameStatus-B4WBgoLs.js → GameStatus-ZSe-qG3y.js} +2 -1
  7. package/dist/{Import-BC5XgwRT.js → Import-D046HBaF.js} +3 -2
  8. package/dist/{JobLogTail-mBXpeWMu.js → JobLogTail-Da8GuReK.js} +3 -2
  9. package/dist/{JobProgress-KZ6EkMFi.js → JobProgress-DltCQpzA.js} +3 -2
  10. package/dist/{JobStatusTable-BYIxTt0d.js → JobStatusTable-DVJjHw97.js} +3 -2
  11. package/dist/{ProjectCredentialsTable-DSy1YIWX.js → ProjectCredentialsTable-BJJz7W1P.js} +2 -2
  12. package/dist/{UserCredentialsTable-qNByRE84.js → UserCredentialsTable-CSynIVHU.js} +2 -1
  13. package/dist/{baseAppleCommand-CdROzhyU.js → baseAppleCommand-Aq-Eaw_K.js} +1 -1
  14. package/dist/baseCommand-CTn3KGH3.js +787 -0
  15. package/dist/{baseGameAndroidCommand-B21zS0MN.js → baseGameAndroidCommand-DRzVMKuG.js} +2 -1
  16. package/dist/{index-Cv-92xRd.js → baseGameCommand-8VL7xe-O.js} +18 -755
  17. package/dist/commands/apiKey/create.js +6 -5
  18. package/dist/commands/apiKey/list.js +6 -5
  19. package/dist/commands/apiKey/revoke.js +6 -5
  20. package/dist/commands/apple/apiKey/create.js +13 -12
  21. package/dist/commands/apple/apiKey/delete.js +7 -6
  22. package/dist/commands/apple/apiKey/export.js +14 -13
  23. package/dist/commands/apple/apiKey/import.js +14 -13
  24. package/dist/commands/apple/apiKey/status.js +13 -12
  25. package/dist/commands/apple/certificate/create.js +13 -12
  26. package/dist/commands/apple/certificate/delete.js +7 -6
  27. package/dist/commands/apple/certificate/export.js +14 -13
  28. package/dist/commands/apple/certificate/import.js +14 -13
  29. package/dist/commands/apple/certificate/status.js +13 -12
  30. package/dist/commands/apple/login.js +4 -3
  31. package/dist/commands/apple/status.js +13 -12
  32. package/dist/commands/dashboard.js +9 -8
  33. package/dist/commands/game/android/apiKey/connect.js +11 -10
  34. package/dist/commands/game/android/apiKey/create.js +13 -12
  35. package/dist/commands/game/android/apiKey/delete.js +6 -5
  36. package/dist/commands/game/android/apiKey/export.js +13 -12
  37. package/dist/commands/game/android/apiKey/import.js +13 -12
  38. package/dist/commands/game/android/apiKey/invite.js +21 -20
  39. package/dist/commands/game/android/apiKey/policy.js +8 -7
  40. package/dist/commands/game/android/apiKey/status.js +13 -12
  41. package/dist/commands/game/android/keyStore/create.js +10 -9
  42. package/dist/commands/game/android/keyStore/delete.js +6 -5
  43. package/dist/commands/game/android/keyStore/export.js +12 -11
  44. package/dist/commands/game/android/keyStore/import.js +15 -14
  45. package/dist/commands/game/android/keyStore/status.js +15 -14
  46. package/dist/commands/game/android/status.js +7 -6
  47. package/dist/commands/game/build/download.js +6 -5
  48. package/dist/commands/game/build/list.js +11 -10
  49. package/dist/commands/game/create.js +4 -3
  50. package/dist/commands/game/details.js +15 -11
  51. package/dist/commands/game/export.js +4 -3
  52. package/dist/commands/game/ios/app/addTester.js +8 -7
  53. package/dist/commands/game/ios/app/create.js +7 -6
  54. package/dist/commands/game/ios/app/status.js +13 -12
  55. package/dist/commands/game/ios/app/sync.js +11 -10
  56. package/dist/commands/game/ios/profile/create.js +9 -8
  57. package/dist/commands/game/ios/profile/delete.js +9 -8
  58. package/dist/commands/game/ios/profile/export.js +12 -11
  59. package/dist/commands/game/ios/profile/import.js +12 -11
  60. package/dist/commands/game/ios/profile/status.js +13 -12
  61. package/dist/commands/game/ios/status.js +17 -16
  62. package/dist/commands/game/ios/wizard.js +7 -6
  63. package/dist/commands/game/job/list.js +6 -5
  64. package/dist/commands/game/job/status.js +11 -10
  65. package/dist/commands/game/list.js +6 -5
  66. package/dist/commands/game/ship.js +8 -7
  67. package/dist/commands/game/status.js +14 -13
  68. package/dist/commands/game/wizard.js +24 -23
  69. package/dist/commands/internal/fastlane.js +14 -13
  70. package/dist/commands/internal/readme.js +18 -17
  71. package/dist/commands/login.js +20 -19
  72. package/dist/commands/status.js +9 -8
  73. package/dist/commands/util/glass.js +119 -0
  74. package/dist/{export-BtUjg3Tl.js → export-DtATljiz.js} +1 -1
  75. package/dist/{import-BYSkF-tX.js → import-Dk2ywOVU.js} +1 -1
  76. package/dist/{index-Du6l7ZyV.js → index-BW7z-5sB.js} +1 -1
  77. package/dist/{index-CgGLBt2v.js → index-CuyVBHWc.js} +4 -3
  78. package/dist/{index-CcGRePRU.js → index-cRnjcGxV.js} +5 -4
  79. package/dist/{upload-LoVBuJbT.js → upload-CHaDSvvi.js} +1 -1
  80. package/dist/{useAppleApp-Bg0x6s97.js → useAppleApp-CR847GWc.js} +1 -1
  81. package/dist/{useAppleBundleId-CEOssLqN.js → useAppleBundleId-BnwPmVEu.js} +1 -1
  82. package/dist/{useAppleProfiles-CHf_gHdZ.js → useAppleProfiles-DY-H0420.js} +1 -1
  83. package/dist/{useGoogleStatus-Ch36GbVo.js → useGoogleStatus-WqPgHteE.js} +2 -1
  84. package/dist/{useProjectCredentials-CsQWPdyo.js → useProjectCredentials-TvlolkId.js} +2 -1
  85. package/dist/{useWebSocket-CWeaaLqi.js → useWebSocket-MXDbQHcu.js} +1 -1
  86. package/docs/README.md +1 -0
  87. package/docs/util/glass.md +47 -0
  88. package/docs/util.md +11 -0
  89. package/package.json +3 -1
@@ -1,39 +1,40 @@
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-8VL7xe-O.js';
6
5
  import 'axios';
7
6
  import 'crypto-js';
8
7
  import 'uuid';
8
+ import { B as BaseCommand } from '../../baseCommand-CTn3KGH3.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 'fs';
33
+ import 'path';
34
+ import 'chalk';
35
+ import '@expo/apple-utils/build/index.js';
36
+ import 'deepmerge';
37
+ import 'ini';
37
38
 
38
39
  const ROOT_TOPIC_NAME = "shipthis";
39
40
  const ROOT_TOPIC_DESCRIPTION = "Root topic";
@@ -133,7 +134,7 @@ function getTopicTree(topics, commands, separateFileDepth) {
133
134
  const includeTopicsAndCommands = currentParent.includeTopicsAndCommands || currentDepth >= separateFileDepth;
134
135
  const newSubTopic = {
135
136
  commands: [],
136
- filePath: `${path.join(...name.split(":"))}.md`,
137
+ filePath: `${path__default.join(...name.split(":"))}.md`,
137
138
  includeTopicsAndCommands,
138
139
  subTopics: [],
139
140
  topic: topicsByName[name]
@@ -153,7 +154,7 @@ function getTopicTree(topics, commands, separateFileDepth) {
153
154
  if (!subTopic) throw new Error("Could not find topic for command: " + command.id);
154
155
  currentParent = subTopic;
155
156
  }
156
- currentParent.commands.push({ command, filePath: `${path.join(...command.id.split(":"))}.md` });
157
+ currentParent.commands.push({ command, filePath: `${path__default.join(...command.id.split(":"))}.md` });
157
158
  }
158
159
  return topicTree;
159
160
  }
@@ -184,13 +185,13 @@ function writeTopic(topic, outputDir, dryRun, overWrite, only) {
184
185
  outputList.push(filePath2);
185
186
  const doWrite = !exists || overWrite;
186
187
  if (!doWrite || dryRun) return;
187
- const folder = path.dirname(filePath2);
188
+ const folder = path__default.dirname(filePath2);
188
189
  fs__default.mkdirSync(folder, { recursive: true });
189
190
  fs__default.writeFileSync(filePath2, rendered);
190
191
  };
191
192
  const skipFile = (filePath2) => only && !filePath2.match(only);
192
193
  const writeOutput = { created: [], overwritten: [] };
193
- const filePath = path.join(outputDir, topic.filePath);
194
+ const filePath = path__default.join(outputDir, topic.filePath);
194
195
  if (!skipFile(filePath)) makeFolderAndSave(filePath, topic.rendered);
195
196
  for (const subTopic of topic.subTopics) {
196
197
  const subWriteOutput = writeTopic(subTopic, outputDir, dryRun, overWrite, only);
@@ -199,7 +200,7 @@ function writeTopic(topic, outputDir, dryRun, overWrite, only) {
199
200
  }
200
201
  for (const command of topic.commands) {
201
202
  if (!command.renderedForFile) throw new Error(`Command ${command.command.id} has not been rendered`);
202
- const filePath2 = path.join(outputDir, command.filePath);
203
+ const filePath2 = path__default.join(outputDir, command.filePath);
203
204
  if (!skipFile(filePath2)) makeFolderAndSave(filePath2, command.renderedForFile);
204
205
  }
205
206
  return writeOutput;
@@ -1,12 +1,29 @@
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';
3
+ import { W as WEB_URL, B as BaseCommand, Z as acceptTerms, o as API_URL, _ as setAuthToken } from '../baseCommand-CTn3KGH3.js';
4
+ import 'react/jsx-runtime';
5
+ import 'ink';
6
+ import 'ink-spinner';
7
+ import { b as getInput } from '../baseGameCommand-8VL7xe-O.js';
8
+ import 'react';
9
+ import '@tanstack/react-query';
10
+ import 'luxon';
4
11
  import 'node:fs';
5
- import 'crypto-js';
12
+ import 'fast-glob';
6
13
  import 'uuid';
7
- import 'luxon';
14
+ import 'yazl';
15
+ import 'socket.io-client';
16
+ import 'fullscreen-ink';
17
+ import 'string-length';
18
+ import 'strip-ansi';
19
+ import 'open';
20
+ import '@inkjs/ui';
8
21
  import 'node:path';
22
+ import 'marked';
23
+ import 'marked-terminal';
24
+ import 'qrcode';
9
25
  import 'chalk';
26
+ import 'crypto-js';
10
27
  import '@expo/apple-utils/build/index.js';
11
28
  import 'node:crypto';
12
29
  import 'node:readline';
@@ -15,24 +32,8 @@ import 'readline-sync';
15
32
  import 'isomorphic-git';
16
33
  import 'deepmerge';
17
34
  import 'ini';
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
- import 'react/jsx-runtime';
26
- import 'ink-spinner';
27
- import 'string-length';
28
- import 'strip-ansi';
29
- import 'open';
30
- import '@inkjs/ui';
31
35
  import 'fs';
32
36
  import 'path';
33
- import 'marked';
34
- import 'marked-terminal';
35
- import 'qrcode';
36
37
 
37
38
  const TERMS_URL = new URL("/terms", WEB_URL).href;
38
39
  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, j as isCWDGodotGame } from '../baseCommand-CTn3KGH3.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,20 @@ 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-8VL7xe-O.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 { C as Command } from '../Command-Cj6F5B5a.js';
33
34
  import chalk from 'chalk';
34
35
  import '@expo/apple-utils/build/index.js';
35
36
  import 'isomorphic-git';
36
37
  import 'deepmerge';
37
38
  import 'ini';
39
+ import '../Title-BCQtayg6.js';
38
40
  import 'fs';
39
41
  import 'path';
40
- import '../Title-BCQtayg6.js';
41
42
 
42
43
  class Status extends BaseCommand {
43
44
  static args = {};
@@ -0,0 +1,119 @@
1
+ import { B as BaseCommand } from '../../baseCommand-CTn3KGH3.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 'deepmerge';
18
+ import 'ini';
19
+ import '@tanstack/react-query';
20
+ import 'react';
21
+ import 'fast-glob';
22
+ import 'yazl';
23
+ import 'socket.io-client';
24
+ import 'fullscreen-ink';
25
+ import 'ink';
26
+
27
+ async function applyLiquidGlassIcon(opts) {
28
+ const { projectDir, iconDir, verbose } = opts;
29
+ const info = (msg) => {
30
+ if (!verbose) return;
31
+ console.log(msg);
32
+ };
33
+ const warn = (msg) => console.warn(`Warning: ${msg}`);
34
+ info(`Applying Liquid Glass icon from: ${iconDir}`);
35
+ if (!fs.existsSync(projectDir)) {
36
+ throw new Error(`projectDir not found: ${projectDir}`);
37
+ }
38
+ const pbxprojPath = path.join(projectDir, "project.pbxproj");
39
+ if (!fs.existsSync(pbxprojPath)) {
40
+ throw new Error(`project.pbxproj not found at: ${pbxprojPath}`);
41
+ }
42
+ if (!fs.existsSync(iconDir)) {
43
+ throw new Error(`Icon directory not found: ${iconDir}`);
44
+ }
45
+ const iconFolderName = path.basename(iconDir);
46
+ const appIconName = iconFolderName.replace(/\.icon$/i, "");
47
+ info(`Detected .icon folder: ${iconFolderName}`);
48
+ info(`Derived app icon name: ${appIconName}`);
49
+ const projectRoot = path.dirname(projectDir);
50
+ const destIconDir = path.join(projectRoot, iconFolderName);
51
+ if (!fs.existsSync(destIconDir)) {
52
+ info(`Copying .icon folder into project root: ${destIconDir}`);
53
+ await fs.promises.cp(iconDir, destIconDir, {
54
+ recursive: true
55
+ });
56
+ } else {
57
+ info(`Icon folder already exists in project root, skipping copy.`);
58
+ }
59
+ const project = xcode.project(pbxprojPath);
60
+ project.parseSync();
61
+ info(`Adding folder reference to Copy Bundle Resources: ${iconFolderName}`);
62
+ const firstProject = project.getFirstProject();
63
+ const mainGroupId = firstProject.firstProject.mainGroup;
64
+ const mainGroup = project.getPBXGroupByKey(mainGroupId);
65
+ const fileRef = project.addResourceFile(
66
+ iconFolderName,
67
+ { lastKnownFileType: "folder.iconcomposer.icon" },
68
+ mainGroup.name
69
+ );
70
+ if (fileRef) {
71
+ project.addToPbxResourcesBuildPhase(fileRef);
72
+ } else {
73
+ warn(`Folder reference may already exist in project: ${iconFolderName}`);
74
+ }
75
+ const configs = project.pbxXCBuildConfigurationSection();
76
+ let modified = 0;
77
+ info(`Updating build settings for app icon: ${appIconName}`);
78
+ for (const key in configs) {
79
+ const cfg = configs[key];
80
+ if (!cfg || typeof cfg !== "object" || !cfg.buildSettings) continue;
81
+ cfg.buildSettings["ASSETCATALOG_COMPILER_APPICON_NAME"] = appIconName;
82
+ cfg.buildSettings["ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS"] = "YES";
83
+ modified++;
84
+ }
85
+ info(`Modified ${modified} build configurations`);
86
+ info(`Writing updated project to ${pbxprojPath}`);
87
+ fs.writeFileSync(pbxprojPath, project.writeSync());
88
+ info(`Liquid Glass icon successfully applied.`);
89
+ }
90
+ class InternalGlass extends BaseCommand {
91
+ static description = "Apply a Liquid Glass .icon folder to a local Xcode project";
92
+ static flags = {
93
+ verbose: Flags.boolean({
94
+ default: false,
95
+ description: "Enable verbose logging"
96
+ })
97
+ };
98
+ static args = {
99
+ project: Args.string({
100
+ description: "Path to the .xcodeproj directory",
101
+ required: true
102
+ }),
103
+ icon: Args.string({
104
+ description: "Path to the .icon folder",
105
+ required: true
106
+ })
107
+ };
108
+ async run() {
109
+ const { args, flags } = await this.parse(InternalGlass);
110
+ await applyLiquidGlassIcon({
111
+ projectDir: args.project,
112
+ iconDir: args.icon,
113
+ verbose: flags.verbose
114
+ });
115
+ this.log("Liquid Glass icon applied.");
116
+ }
117
+ }
118
+
119
+ 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 { o as API_URL, p as getAuthedHeaders } from './baseCommand-CTn3KGH3.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 { o as API_URL, p as getAuthedHeaders } from './baseCommand-CTn3KGH3.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`;
@@ -1,5 +1,5 @@
1
1
  import axios from 'axios';
2
- import { t as API_URL, u as getAuthedHeaders, V as castArrayObjectDates } from './index-Cv-92xRd.js';
2
+ import { o as API_URL, p as getAuthedHeaders, F as castArrayObjectDates } from './baseCommand-CTn3KGH3.js';
3
3
  import 'node:fs';
4
4
 
5
5
  async function getUserCredentials(pageSize = 100) {
@@ -12,7 +12,7 @@ import 'readline-sync';
12
12
  import 'luxon';
13
13
  import 'axios';
14
14
  import 'isomorphic-git';
15
- import { av as getShortAuthRequiredUrl, ax as getGoogleAuthUrl, R as GameContext, at as useSafeInput, W as WEB_URL, au as Markdown } from './index-Cv-92xRd.js';
15
+ import { a3 as getShortAuthRequiredUrl, a5 as getGoogleAuthUrl, W as WEB_URL } from './baseCommand-CTn3KGH3.js';
16
16
  import '@oclif/core';
17
17
  import '@tanstack/react-query';
18
18
  import 'crypto-js';
@@ -20,9 +20,10 @@ import 'uuid';
20
20
  import 'fast-glob';
21
21
  import 'yazl';
22
22
  import 'socket.io-client';
23
- import { u as useGoogleStatus } from './useGoogleStatus-Ch36GbVo.js';
24
- import { u as useWebSocket } from './useWebSocket-CWeaaLqi.js';
23
+ import { u as useGoogleStatus } from './useGoogleStatus-WqPgHteE.js';
24
+ import { u as useWebSocket } from './useWebSocket-MXDbQHcu.js';
25
25
  import 'fullscreen-ink';
26
+ import { G as GameContext, w as useSafeInput, M as Markdown } from './baseGameCommand-8VL7xe-O.js';
26
27
  import 'string-length';
27
28
  import 'strip-ansi';
28
29
  import '@inkjs/ui';
@@ -8,20 +8,21 @@ import 'node:path';
8
8
  import 'node:readline';
9
9
  import 'node:url';
10
10
  import 'readline-sync';
11
- import { a0 as cacheKeys, u as getAuthedHeaders, t as API_URL, aw as castObjectDates, X as queryClient, a5 as revokePolicy, a4 as enforcePolicy, P as Platform, C as CredentialsType, a2 as getGoogleStatus, R as GameContext, at as useSafeInput, au as Markdown, f as getShortDate } from './index-Cv-92xRd.js';
11
+ import { p as getAuthedHeaders, o as API_URL, a4 as castObjectDates, H as queryClient, Q as revokePolicy, O as enforcePolicy, P as Platform, C as CredentialsType, M as getGoogleStatus, c as getShortDate } from './baseCommand-CTn3KGH3.js';
12
12
  import axios from 'axios';
13
13
  import 'isomorphic-git';
14
14
  import '@oclif/core';
15
15
  import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
16
16
  import 'luxon';
17
+ import { k as cacheKeys, G as GameContext, w as useSafeInput, M as Markdown } from './baseGameCommand-8VL7xe-O.js';
17
18
  import 'fast-glob';
18
19
  import 'uuid';
19
20
  import 'yazl';
20
21
  import 'socket.io-client';
21
22
  import 'fullscreen-ink';
22
- import { u as useWebSocket } from './useWebSocket-CWeaaLqi.js';
23
- import { u as useProjectCredentials } from './useProjectCredentials-CsQWPdyo.js';
24
- import { u as useGoogleStatus } from './useGoogleStatus-Ch36GbVo.js';
23
+ import { u as useWebSocket } from './useWebSocket-MXDbQHcu.js';
24
+ import { u as useProjectCredentials } from './useProjectCredentials-TvlolkId.js';
25
+ import { u as useGoogleStatus } from './useGoogleStatus-WqPgHteE.js';
25
26
  import 'crypto-js';
26
27
  import 'string-length';
27
28
  import 'strip-ansi';
@@ -1,5 +1,5 @@
1
1
  import axios from 'axios';
2
- import { t as API_URL, u as getAuthedHeaders } from './index-Cv-92xRd.js';
2
+ import { o as API_URL, p as getAuthedHeaders } from './baseCommand-CTn3KGH3.js';
3
3
 
4
4
  async function getNewUploadTicket(projectId = null) {
5
5
  const url = projectId ? `${API_URL}/projects/${projectId}/credentials/url` : `${API_URL}/credentials/url`;
@@ -1,5 +1,5 @@
1
1
  import { useQuery } from '@tanstack/react-query';
2
- import { l as App } from './index-Cv-92xRd.js';
2
+ import { f as App } from './baseCommand-CTn3KGH3.js';
3
3
 
4
4
  const queryAppleApp = async ({ ctx, iosBundleId }) => {
5
5
  if (!iosBundleId) {
@@ -1,5 +1,5 @@
1
1
  import { useQuery } from '@tanstack/react-query';
2
- import { k as BundleId, v as getGodotProjectCapabilities, P as Platform, G as GODOT_CAPABILITIES, w as CapabilityType } from './index-Cv-92xRd.js';
2
+ import { e as BundleId, q as getGodotProjectCapabilities, P as Platform, G as GODOT_CAPABILITIES, r as CapabilityType } from './baseCommand-CTn3KGH3.js';
3
3
 
4
4
  async function getBundleIdCapabilities(bundleId) {
5
5
  const current = await bundleId.getBundleIdCapabilitiesAsync();
@@ -1,6 +1,6 @@
1
1
  import { useQuery } from '@tanstack/react-query';
2
2
  import { DateTime } from 'luxon';
3
- import { f as getShortDate, r as Profile, s as ProfileType } from './index-Cv-92xRd.js';
3
+ import { c as getShortDate, m as Profile, n as ProfileType } from './baseCommand-CTn3KGH3.js';
4
4
  import 'node:crypto';
5
5
  import 'node:fs';
6
6
  import 'node:path';
@@ -1,5 +1,6 @@
1
1
  import { useQuery } from '@tanstack/react-query';
2
- import { a0 as cacheKeys, a2 as getGoogleStatus } from './index-Cv-92xRd.js';
2
+ import { M as getGoogleStatus } from './baseCommand-CTn3KGH3.js';
3
+ import { k as cacheKeys } from './baseGameCommand-8VL7xe-O.js';
3
4
 
4
5
  const useGoogleStatus = () => useQuery({
5
6
  queryFn: getGoogleStatus,
@@ -1,6 +1,7 @@
1
1
  import { useQuery } from '@tanstack/react-query';
2
2
  import axios from 'axios';
3
- import { a0 as cacheKeys, g as getShortUUID, f as getShortDate, u as getAuthedHeaders, t as API_URL, V as castArrayObjectDates } from './index-Cv-92xRd.js';
3
+ import { c as getShortDate, p as getAuthedHeaders, o as API_URL, F as castArrayObjectDates } from './baseCommand-CTn3KGH3.js';
4
+ import { k as cacheKeys, g as getShortUUID } from './baseGameCommand-8VL7xe-O.js';
4
5
 
5
6
  async function queryProjectCredentials({
6
7
  projectId,
@@ -1,6 +1,6 @@
1
1
  import { useEffect } from 'react';
2
2
  import { io } from 'socket.io-client';
3
- import { _ as WS_URL, $ as getAuthToken } from './index-Cv-92xRd.js';
3
+ import { I as WS_URL, K as getAuthToken } from './baseCommand-CTn3KGH3.js';
4
4
 
5
5
  function useWebSocket(listeners = []) {
6
6
  const log = () => {
package/docs/README.md CHANGED
@@ -11,6 +11,7 @@ Begin with our [Quickstart Guide](https://shipth.is/docs/guides/quick-start).
11
11
  - [apiKey](https://shipth.is/docs/reference/apiKey) - Commands that relate to ShipThis API keys
12
12
  - [apple](https://shipth.is/docs/reference/apple) - Commands that relate to linking your ShipThis account with your Apple Developer Account
13
13
  - [game](https://shipth.is/docs/reference/game) - Commands that relate to configuring the specific game in the current working directory
14
+ - [util](https://shipth.is/docs/reference/util) - Utility commands that do not require login
14
15
 
15
16
  ## Commands
16
17
 
@@ -0,0 +1,47 @@
1
+ # Command: `util glass`
2
+
3
+ ## Description
4
+
5
+ Applies a Liquid Glass `.icon` folder to a local Xcode project.
6
+
7
+ This updates the project's resources to include the specified `.icon` which Xcode will use as the app icon at build time.
8
+ Useful when preparing an iOS export created by Godot, when you want to apply a Liquid Glass icon locally before building.
9
+
10
+ :::note
11
+ Liquid Glass icons are bundles in the `.icon` format.
12
+ They look like a single file in Finder, but are actually directories containing all icon variants.
13
+ :::
14
+
15
+ This command works locally and does **not** require authentication.
16
+
17
+ ## Arguments
18
+
19
+ - **`PROJECT`** - Path to the `.xcodeproj` directory you want to modify.
20
+ - **`ICON`** - Path to the `.icon` folder (e.g. `AppIcon.icon`).
21
+
22
+ ## Example
23
+
24
+ Apply `MyIcon.icon` to an exported Xcode project:
25
+
26
+ ```bash
27
+ shipthis util glass ios/output.xcodeproj MyIcon.icon
28
+ ```
29
+
30
+ This will update the project configuration so that Xcode will use `MyIcon.icon` as the icon.
31
+
32
+ ## Help Output
33
+
34
+ ```help
35
+ USAGE
36
+ $ shipthis util glass PROJECT ICON [--verbose]
37
+
38
+ ARGUMENTS
39
+ PROJECT Path to the .xcodeproj directory
40
+ ICON Path to the .icon folder
41
+
42
+ FLAGS
43
+ --verbose Enable verbose logging
44
+
45
+ DESCRIPTION
46
+ Apply a Liquid Glass .icon folder to a local Xcode project
47
+ ```
package/docs/util.md ADDED
@@ -0,0 +1,11 @@
1
+ # Topic: `util`
2
+
3
+ Commands in this topic are invoked as `shipthis util <command>`.
4
+
5
+ :::tip
6
+ These commands do not require authentication.
7
+ :::
8
+
9
+ ## Commands
10
+
11
+ - [util glass](/docs/reference/util/glass.md)
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "shipthis",
3
3
  "description": "ShipThis manages building and uploading your Godot games to the App Store and Google Play.",
4
- "version": "0.1.39",
4
+ "version": "0.1.41",
5
5
  "author": "Hello Invent Ltd",
6
6
  "bin": {
7
7
  "shipthis": "./bin/run.js"
@@ -44,6 +44,7 @@
44
44
  "tough-cookie": "^5.0.0",
45
45
  "tsc-alias": "^1.8.10",
46
46
  "uuid": "^10.0.0",
47
+ "xcode": "^3.0.2-nightly.20251120002524064.sha.c491d3a2",
47
48
  "yazl": "^2.5.1"
48
49
  },
49
50
  "devDependencies": {
@@ -106,6 +107,7 @@
106
107
  "type": "module",
107
108
  "exports": [
108
109
  "./dist/utils/help.js",
110
+ "./dist/commands/util/glass.js",
109
111
  "./dist/commands/apple/apiKey/export.js",
110
112
  "./dist/commands/apple/apiKey/create.js",
111
113
  "./dist/commands/apple/apiKey/status.js",