shipthis 0.1.23 → 0.1.25
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.
- package/README.md +25 -16
- package/docs/assets/ship-outputx0.8.gif +0 -0
- package/package.json +1 -1
- package/bin/readme.sh +0 -15
- package/dist/AppleBundleIdDetails-C9C5WSPR.js +0 -76
- package/dist/Command-BQCJ9Wf-.js +0 -28
- package/dist/CommandGame-CkGqTno0.js +0 -9
- package/dist/Create-t_E231OA.js +0 -59
- package/dist/Import-Ljz1gxXd.js +0 -110
- package/dist/JobProgress-D9tHgBvi.js +0 -121
- package/dist/JobStatusTable-DmI7qCHc.js +0 -203
- package/dist/NextSteps-CK9zHOCt.js +0 -18
- package/dist/ProgressSpinner-6pw1T8Iw.js +0 -16
- package/dist/ProjectCredentialsTable-CTkP1mvy.js +0 -37
- package/dist/RunWithSpinner-BVXNWGD3.js +0 -27
- package/dist/StatusTable-Dm5St4g-.js +0 -33
- package/dist/Table-CvM6pccN.js +0 -101
- package/dist/Title-BCQtayg6.js +0 -6
- package/dist/UserCredentialsTable-DhtM_iTG.js +0 -82
- package/dist/baseAppleCommand-IGl6KTvv.js +0 -10
- package/dist/baseGameAndroidCommand-DFn4zMvq.js +0 -43
- package/dist/commands/apple/apiKey/create.js +0 -103
- package/dist/commands/apple/apiKey/export.js +0 -81
- package/dist/commands/apple/apiKey/import.js +0 -85
- package/dist/commands/apple/apiKey/status.js +0 -122
- package/dist/commands/apple/certificate/create.js +0 -133
- package/dist/commands/apple/certificate/export.js +0 -81
- package/dist/commands/apple/certificate/import.js +0 -85
- package/dist/commands/apple/certificate/status.js +0 -130
- package/dist/commands/apple/login.js +0 -76
- package/dist/commands/apple/status.js +0 -79
- package/dist/commands/dashboard.js +0 -38
- package/dist/commands/game/android/apiKey/connect.js +0 -74
- package/dist/commands/game/android/apiKey/create.js +0 -74
- package/dist/commands/game/android/apiKey/export.js +0 -84
- package/dist/commands/game/android/apiKey/import.js +0 -93
- package/dist/commands/game/android/apiKey/invite.js +0 -81
- package/dist/commands/game/android/apiKey/status.js +0 -87
- package/dist/commands/game/android/keyStore/create.js +0 -69
- package/dist/commands/game/android/keyStore/export.js +0 -83
- package/dist/commands/game/android/keyStore/import.js +0 -112
- package/dist/commands/game/android/keyStore/status.js +0 -70
- package/dist/commands/game/android/status.js +0 -84
- package/dist/commands/game/build/download.js +0 -80
- package/dist/commands/game/build/list.js +0 -94
- package/dist/commands/game/create.js +0 -67
- package/dist/commands/game/details.js +0 -113
- package/dist/commands/game/export.js +0 -58
- package/dist/commands/game/ios/app/addTester.js +0 -124
- package/dist/commands/game/ios/app/create.js +0 -117
- package/dist/commands/game/ios/app/status.js +0 -66
- package/dist/commands/game/ios/app/sync.js +0 -95
- package/dist/commands/game/ios/profile/create.js +0 -129
- package/dist/commands/game/ios/profile/export.js +0 -83
- package/dist/commands/game/ios/profile/import.js +0 -92
- package/dist/commands/game/ios/profile/status.js +0 -139
- package/dist/commands/game/ios/status.js +0 -92
- package/dist/commands/game/ios/wizard.js +0 -153
- package/dist/commands/game/job/list.js +0 -91
- package/dist/commands/game/job/status.js +0 -91
- package/dist/commands/game/list.js +0 -83
- package/dist/commands/game/ship.js +0 -205
- package/dist/commands/game/status.js +0 -114
- package/dist/commands/game/wizard.js +0 -686
- package/dist/commands/internal/fastlane.js +0 -74
- package/dist/commands/internal/readme.js +0 -937
- package/dist/commands/login.js +0 -92
- package/dist/commands/status.js +0 -76
- package/dist/export-CVs_xoDN.js +0 -36
- package/dist/git-DREGq-jc.js +0 -32
- package/dist/import-Ch5O7xfN.js +0 -47
- package/dist/index-BB00V5oF.js +0 -136
- package/dist/index-CIa2EDQ6.js +0 -24
- package/dist/index-DkNQs11R.js +0 -711
- package/dist/index-DrcGhlrc.js +0 -138
- package/dist/index-DyOv-ge5.js +0 -125
- package/dist/index-vMXsdSCy.js +0 -208
- package/dist/index.d.ts +0 -1
- package/dist/index.js +0 -1
- package/dist/upload-CRE2nVdd.js +0 -60
- package/dist/useAndroidServiceAccountTestResult-DcYDam-p.js +0 -52
- package/dist/useAppleApp-B16WbUxJ.js +0 -32
- package/dist/useAppleBundleId-DobPATan.js +0 -64
- package/dist/useJobWatching-BZSUa8E-.js +0 -45
- package/dist/useProjectCredentials-Btnr7WK3.js +0 -54
- package/dist/useWebSocket-ByuNoqRw.js +0 -36
- package/dist/utils/help.js +0 -14
- package/npm-shrinkwrap.json +0 -14011
- package/oclif.manifest.json +0 -2275
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
import { jsx } from 'react/jsx-runtime';
|
|
2
|
-
import { Args, Flags } from '@oclif/core';
|
|
3
|
-
import { render } from 'ink';
|
|
4
|
-
import * as fs from 'fs';
|
|
5
|
-
import { c as BaseGameCommand, K as downloadBuildById } from '../../../index-DkNQs11R.js';
|
|
6
|
-
import 'react';
|
|
7
|
-
import '../../../index-vMXsdSCy.js';
|
|
8
|
-
import 'ink-spinner';
|
|
9
|
-
import '@inkjs/ui';
|
|
10
|
-
import 'axios';
|
|
11
|
-
import '@tanstack/react-query';
|
|
12
|
-
import 'uuid';
|
|
13
|
-
import 'yazl';
|
|
14
|
-
import 'crypto';
|
|
15
|
-
import 'readline-sync';
|
|
16
|
-
import 'node:readline';
|
|
17
|
-
import 'node:path';
|
|
18
|
-
import 'node:url';
|
|
19
|
-
import 'luxon';
|
|
20
|
-
import 'isomorphic-git';
|
|
21
|
-
import 'fast-glob';
|
|
22
|
-
import 'socket.io-client';
|
|
23
|
-
import 'open';
|
|
24
|
-
import 'marked';
|
|
25
|
-
import 'marked-terminal';
|
|
26
|
-
import 'path';
|
|
27
|
-
import 'qrcode';
|
|
28
|
-
import { R as RunWithSpinner } from '../../../RunWithSpinner-BVXNWGD3.js';
|
|
29
|
-
import 'string-length';
|
|
30
|
-
import 'strip-ansi';
|
|
31
|
-
import { C as Command } from '../../../Command-BQCJ9Wf-.js';
|
|
32
|
-
import '@expo/apple-utils/build/index.js';
|
|
33
|
-
import 'crypto-js';
|
|
34
|
-
import 'ini';
|
|
35
|
-
import 'deepmerge';
|
|
36
|
-
import '../../../index-BB00V5oF.js';
|
|
37
|
-
import '../../../useAndroidServiceAccountTestResult-DcYDam-p.js';
|
|
38
|
-
|
|
39
|
-
class GameBuildDownload extends BaseGameCommand {
|
|
40
|
-
static args = {
|
|
41
|
-
build_id: Args.string({ description: "The ID of the build to download", required: true }),
|
|
42
|
-
file: Args.string({ description: "Name of the file to output", required: true })
|
|
43
|
-
};
|
|
44
|
-
static description = "Downloads the given build artifact to the specified file";
|
|
45
|
-
static examples = [
|
|
46
|
-
"<%= config.bin %> <%= command.id %> 7a3f5c92 output.ipa",
|
|
47
|
-
"<%= config.bin %> <%= command.id %> --gameId 0c179fc4 e4b9a3d7 output.apk"
|
|
48
|
-
];
|
|
49
|
-
static flags = {
|
|
50
|
-
...BaseGameCommand.flags,
|
|
51
|
-
force: Flags.boolean({ char: "f", description: "Overwrite the file if it already exists" })
|
|
52
|
-
};
|
|
53
|
-
async run() {
|
|
54
|
-
const { args, flags } = this;
|
|
55
|
-
const { file, build_id } = args;
|
|
56
|
-
const { force } = flags;
|
|
57
|
-
const alreadyExists = fs.existsSync(file);
|
|
58
|
-
if (alreadyExists && !force) {
|
|
59
|
-
this.error(`The file ${file} already exists. Use --force to overwrite it.`);
|
|
60
|
-
}
|
|
61
|
-
const executeMethod = async () => {
|
|
62
|
-
const game = await this.getGame();
|
|
63
|
-
await downloadBuildById(game.id, build_id, file);
|
|
64
|
-
};
|
|
65
|
-
const handleComplete = async () => process.exit(0);
|
|
66
|
-
render(
|
|
67
|
-
/* @__PURE__ */ jsx(Command, { command: this, children: /* @__PURE__ */ jsx(
|
|
68
|
-
RunWithSpinner,
|
|
69
|
-
{
|
|
70
|
-
msgInProgress: `Downloading to ${file}...`,
|
|
71
|
-
msgComplete: `Downloaded build artifact to ${file}`,
|
|
72
|
-
executeMethod,
|
|
73
|
-
onComplete: handleComplete
|
|
74
|
-
}
|
|
75
|
-
) })
|
|
76
|
-
);
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
export { GameBuildDownload as default };
|
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
-
import { Box, Text, render } from 'ink';
|
|
3
|
-
import { Flags } from '@oclif/core';
|
|
4
|
-
import { c as BaseGameCommand } from '../../../index-DkNQs11R.js';
|
|
5
|
-
import 'react';
|
|
6
|
-
import { c as useBuilds, d as getBuildSummary } from '../../../index-vMXsdSCy.js';
|
|
7
|
-
import Spinner from 'ink-spinner';
|
|
8
|
-
import 'axios';
|
|
9
|
-
import 'crypto-js';
|
|
10
|
-
import 'uuid';
|
|
11
|
-
import 'fs';
|
|
12
|
-
import 'luxon';
|
|
13
|
-
import '@inkjs/ui';
|
|
14
|
-
import '@tanstack/react-query';
|
|
15
|
-
import 'yazl';
|
|
16
|
-
import 'crypto';
|
|
17
|
-
import 'readline-sync';
|
|
18
|
-
import 'node:readline';
|
|
19
|
-
import 'node:path';
|
|
20
|
-
import 'node:url';
|
|
21
|
-
import 'isomorphic-git';
|
|
22
|
-
import 'fast-glob';
|
|
23
|
-
import 'socket.io-client';
|
|
24
|
-
import 'open';
|
|
25
|
-
import 'marked';
|
|
26
|
-
import 'marked-terminal';
|
|
27
|
-
import 'path';
|
|
28
|
-
import 'qrcode';
|
|
29
|
-
import 'string-length';
|
|
30
|
-
import 'strip-ansi';
|
|
31
|
-
import { C as CommandGame } from '../../../CommandGame-CkGqTno0.js';
|
|
32
|
-
import { T as Table } from '../../../Table-CvM6pccN.js';
|
|
33
|
-
import { T as Title } from '../../../Title-BCQtayg6.js';
|
|
34
|
-
import '@expo/apple-utils/build/index.js';
|
|
35
|
-
import 'ini';
|
|
36
|
-
import 'deepmerge';
|
|
37
|
-
import '../../../index-BB00V5oF.js';
|
|
38
|
-
import '../../../useAndroidServiceAccountTestResult-DcYDam-p.js';
|
|
39
|
-
import '../../../Command-BQCJ9Wf-.js';
|
|
40
|
-
|
|
41
|
-
const BuildsTable = ({ queryProps, ...boxProps }) => {
|
|
42
|
-
const { isLoading, data } = useBuilds(queryProps);
|
|
43
|
-
return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginBottom: 1, ...boxProps, children: [
|
|
44
|
-
/* @__PURE__ */ jsx(Title, { children: `Builds uploaded to ShipThis from completed jobs for this game.` }),
|
|
45
|
-
isLoading && /* @__PURE__ */ jsx(Spinner, { type: "dots" }),
|
|
46
|
-
data && /* @__PURE__ */ jsx(Table, { data: data.data.map(getBuildSummary) }),
|
|
47
|
-
data && data.pageCount > 1 && /* @__PURE__ */ jsxs(Box, { marginTop: 1, flexDirection: "column", children: [
|
|
48
|
-
/* @__PURE__ */ jsx(Text, { children: `Showing page ${(queryProps.pageNumber || 0) + 1} of ${data.pageCount}.` }),
|
|
49
|
-
/* @__PURE__ */ jsx(Text, { children: "Use the --pageNumber parameter to see other pages." })
|
|
50
|
-
] })
|
|
51
|
-
] });
|
|
52
|
-
};
|
|
53
|
-
|
|
54
|
-
class GameBuildList extends BaseGameCommand {
|
|
55
|
-
static args = {};
|
|
56
|
-
static description = "Lists the builds for successful jobs of a game.";
|
|
57
|
-
static examples = [
|
|
58
|
-
"<%= config.bin %> <%= command.id %>",
|
|
59
|
-
"<%= config.bin %> <%= command.id %> --gameId 0c179fc4",
|
|
60
|
-
"<%= config.bin %> <%= command.id %> --gameId 0c179fc4 --pageSize 20 --pageNumber 1"
|
|
61
|
-
];
|
|
62
|
-
static flags = {
|
|
63
|
-
...super.flags,
|
|
64
|
-
pageNumber: Flags.integer({ char: "p", description: "The page number to show (starts at 0)", default: 0 }),
|
|
65
|
-
pageSize: Flags.integer({ char: "s", description: "The number of items to show per page", default: 10 }),
|
|
66
|
-
orderBy: Flags.string({
|
|
67
|
-
char: "o",
|
|
68
|
-
description: "The field to order by",
|
|
69
|
-
default: "createdAt",
|
|
70
|
-
options: ["createdAt", "updatedAt"]
|
|
71
|
-
}),
|
|
72
|
-
order: Flags.string({
|
|
73
|
-
char: "r",
|
|
74
|
-
description: "The order to sort by",
|
|
75
|
-
default: "desc",
|
|
76
|
-
options: ["asc", "desc"]
|
|
77
|
-
})
|
|
78
|
-
};
|
|
79
|
-
async run() {
|
|
80
|
-
const game = await this.getGame();
|
|
81
|
-
const { flags } = this;
|
|
82
|
-
const { gameId, ...otherFlags } = flags;
|
|
83
|
-
const params = otherFlags;
|
|
84
|
-
const queryProps = {
|
|
85
|
-
projectId: game.id,
|
|
86
|
-
...params
|
|
87
|
-
};
|
|
88
|
-
render(
|
|
89
|
-
/* @__PURE__ */ jsx(CommandGame, { command: this, children: /* @__PURE__ */ jsx(BuildsTable, { queryProps }) })
|
|
90
|
-
);
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
export { GameBuildList as default };
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
import { Flags } from '@oclif/core';
|
|
2
|
-
import { B as BaseAuthenticatedCommand, D as DetailsFlags, j as isCWDGodotGame, t as GameEngine, u as getGodotVersion, v as createProject, w as DEFAULT_IGNORED_FILES_GLOBS, x as DEFAULT_SHIPPED_FILES_GLOBS, y as getGodotProjectName } from '../../index-DkNQs11R.js';
|
|
3
|
-
import { a as getInput } from '../../index-BB00V5oF.js';
|
|
4
|
-
import 'path';
|
|
5
|
-
import 'fs';
|
|
6
|
-
import '@expo/apple-utils/build/index.js';
|
|
7
|
-
import 'axios';
|
|
8
|
-
import 'crypto-js';
|
|
9
|
-
import 'uuid';
|
|
10
|
-
import 'luxon';
|
|
11
|
-
import 'crypto';
|
|
12
|
-
import 'readline-sync';
|
|
13
|
-
import 'node:readline';
|
|
14
|
-
import 'node:path';
|
|
15
|
-
import 'node:url';
|
|
16
|
-
import 'isomorphic-git';
|
|
17
|
-
import 'ini';
|
|
18
|
-
import 'deepmerge';
|
|
19
|
-
import 'react';
|
|
20
|
-
import '@tanstack/react-query';
|
|
21
|
-
import 'fast-glob';
|
|
22
|
-
import 'yazl';
|
|
23
|
-
import 'socket.io-client';
|
|
24
|
-
|
|
25
|
-
class GameCreate extends BaseAuthenticatedCommand {
|
|
26
|
-
static args = {};
|
|
27
|
-
static description = "Create a new game in ShipThis.";
|
|
28
|
-
static examples = ["<%= config.bin %> <%= command.id %>"];
|
|
29
|
-
static flags = {
|
|
30
|
-
quiet: Flags.boolean({ char: "q", description: "Avoid output except for interactions and errors" }),
|
|
31
|
-
force: Flags.boolean({ char: "f" }),
|
|
32
|
-
...DetailsFlags
|
|
33
|
-
};
|
|
34
|
-
async run() {
|
|
35
|
-
const { flags } = this;
|
|
36
|
-
const { quiet, force, name: flagName, ...details } = flags;
|
|
37
|
-
if (this.hasProjectConfig() && !force) {
|
|
38
|
-
throw new Error("This directory already has a ShipThis project. Use --force to overwrite.");
|
|
39
|
-
}
|
|
40
|
-
if (!isCWDGodotGame()) {
|
|
41
|
-
this.error("No Godot project detected. Please run this from a godot project directory.", { exit: 1 });
|
|
42
|
-
}
|
|
43
|
-
const getName = async () => {
|
|
44
|
-
if (flagName) return flagName;
|
|
45
|
-
const suggested = getGodotProjectName() || "My Awesome Game";
|
|
46
|
-
const entered = await getInput(`Please enter the name of the game, or press enter to use ${suggested}: `);
|
|
47
|
-
return entered || suggested;
|
|
48
|
-
};
|
|
49
|
-
const name = await getName();
|
|
50
|
-
const gameEngine = GameEngine.GODOT;
|
|
51
|
-
const gameEngineVersion = getGodotVersion();
|
|
52
|
-
const projectDetails = {
|
|
53
|
-
...details,
|
|
54
|
-
gameEngine,
|
|
55
|
-
gameEngineVersion
|
|
56
|
-
};
|
|
57
|
-
const project = await createProject({ name, details: projectDetails });
|
|
58
|
-
await this.setProjectConfig({
|
|
59
|
-
project,
|
|
60
|
-
shippedFilesGlobs: DEFAULT_SHIPPED_FILES_GLOBS,
|
|
61
|
-
ignoredFilesGlobs: DEFAULT_IGNORED_FILES_GLOBS
|
|
62
|
-
});
|
|
63
|
-
if (!flags.quiet) await this.config.runCommand("game:status");
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
export { GameCreate as default };
|
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
import { jsx } from 'react/jsx-runtime';
|
|
2
|
-
import { render } from 'ink';
|
|
3
|
-
import { Flags } from '@oclif/core';
|
|
4
|
-
import 'react';
|
|
5
|
-
import '../../index-vMXsdSCy.js';
|
|
6
|
-
import { c as BaseGameCommand, D as DetailsFlags, t as GameEngine } from '../../index-DkNQs11R.js';
|
|
7
|
-
import 'ink-spinner';
|
|
8
|
-
import 'axios';
|
|
9
|
-
import 'crypto-js';
|
|
10
|
-
import 'uuid';
|
|
11
|
-
import 'fs';
|
|
12
|
-
import 'luxon';
|
|
13
|
-
import '@inkjs/ui';
|
|
14
|
-
import '@tanstack/react-query';
|
|
15
|
-
import 'yazl';
|
|
16
|
-
import { i as isValidSemVer } from '../../index-BB00V5oF.js';
|
|
17
|
-
import 'open';
|
|
18
|
-
import 'marked';
|
|
19
|
-
import 'marked-terminal';
|
|
20
|
-
import 'path';
|
|
21
|
-
import 'qrcode';
|
|
22
|
-
import { S as StatusTable } from '../../StatusTable-Dm5St4g-.js';
|
|
23
|
-
import 'string-length';
|
|
24
|
-
import 'strip-ansi';
|
|
25
|
-
import 'fast-glob';
|
|
26
|
-
import { C as Command } from '../../Command-BQCJ9Wf-.js';
|
|
27
|
-
import 'socket.io-client';
|
|
28
|
-
import '../../useAndroidServiceAccountTestResult-DcYDam-p.js';
|
|
29
|
-
import '@expo/apple-utils/build/index.js';
|
|
30
|
-
import 'crypto';
|
|
31
|
-
import 'readline-sync';
|
|
32
|
-
import 'node:readline';
|
|
33
|
-
import 'node:path';
|
|
34
|
-
import 'node:url';
|
|
35
|
-
import 'isomorphic-git';
|
|
36
|
-
import 'ini';
|
|
37
|
-
import 'deepmerge';
|
|
38
|
-
import '../../Title-BCQtayg6.js';
|
|
39
|
-
|
|
40
|
-
class GameDetails extends BaseGameCommand {
|
|
41
|
-
static args = {};
|
|
42
|
-
static description = "Shows and sets the details of a game.";
|
|
43
|
-
static examples = [
|
|
44
|
-
"<%= config.bin %> <%= command.id %>",
|
|
45
|
-
"<%= config.bin %> <%= command.id %> --gameId 0c179fc4",
|
|
46
|
-
"<%= config.bin %> <%= command.id %> --buildNumber 5 --semanticVersion 1.2.3",
|
|
47
|
-
"<%= config.bin %> <%= command.id %> --gameEngine godot --gameEngineVersion 4.2 --force"
|
|
48
|
-
];
|
|
49
|
-
static flags = {
|
|
50
|
-
...BaseGameCommand.flags,
|
|
51
|
-
force: Flags.boolean({ char: "f", description: "Force the command to run" }),
|
|
52
|
-
...DetailsFlags
|
|
53
|
-
};
|
|
54
|
-
async run() {
|
|
55
|
-
const { gameId, force, ...valueFlags } = this.flags;
|
|
56
|
-
const {
|
|
57
|
-
name,
|
|
58
|
-
semanticVersion,
|
|
59
|
-
buildNumber,
|
|
60
|
-
gameEngine,
|
|
61
|
-
gameEngineVersion,
|
|
62
|
-
iosBundleId,
|
|
63
|
-
androidPackageName,
|
|
64
|
-
gcpProjectId,
|
|
65
|
-
gcpServiceAccountId
|
|
66
|
-
} = valueFlags;
|
|
67
|
-
if (semanticVersion && !isValidSemVer(semanticVersion))
|
|
68
|
-
throw new Error(`Invalid semantic version: ${semanticVersion}`);
|
|
69
|
-
if ((gameEngine || gameEngineVersion || iosBundleId || androidPackageName) && !force)
|
|
70
|
-
throw new Error("Use --force to set the restricted fields");
|
|
71
|
-
if (gameEngine && gameEngine !== GameEngine.GODOT) throw new Error(`Game engine ${gameEngine} not supported`);
|
|
72
|
-
let game = await this.getGame();
|
|
73
|
-
const update = {
|
|
74
|
-
name: name || game.name,
|
|
75
|
-
details: {
|
|
76
|
-
...game.details,
|
|
77
|
-
...semanticVersion && { semanticVersion },
|
|
78
|
-
...buildNumber && { buildNumber },
|
|
79
|
-
...gameEngine && { gameEngine },
|
|
80
|
-
...gameEngineVersion && { gameEngineVersion },
|
|
81
|
-
...iosBundleId && { iosBundleId },
|
|
82
|
-
...androidPackageName && { androidPackageName },
|
|
83
|
-
...gcpProjectId && { gcpProjectId },
|
|
84
|
-
...gcpServiceAccountId && { gcpServiceAccountId }
|
|
85
|
-
}
|
|
86
|
-
};
|
|
87
|
-
if (Object.keys(valueFlags).length > 0) {
|
|
88
|
-
game = await this.updateGame(update);
|
|
89
|
-
}
|
|
90
|
-
render(
|
|
91
|
-
/* @__PURE__ */ jsx(Command, { command: this, children: /* @__PURE__ */ jsx(
|
|
92
|
-
StatusTable,
|
|
93
|
-
{
|
|
94
|
-
title: "Game Details",
|
|
95
|
-
statuses: {
|
|
96
|
-
"Game Name": game.name,
|
|
97
|
-
"Game Engine": game.details?.gameEngine || "Please set!",
|
|
98
|
-
"Game Engine Version": game.details?.gameEngineVersion || "Please set!",
|
|
99
|
-
"iOS Bundle ID": game.details?.iosBundleId || "N/A",
|
|
100
|
-
"Android Package Name": game.details?.androidPackageName || "N/A",
|
|
101
|
-
"Semantic Version": game.details?.semanticVersion || "0.0.1",
|
|
102
|
-
"Build Number": game.details?.buildNumber || 1,
|
|
103
|
-
"GCP Project ID": game.details?.gcpProjectId || "N/A",
|
|
104
|
-
"GCP Service Account ID": game.details?.gcpServiceAccountId || "N/A"
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
) })
|
|
108
|
-
);
|
|
109
|
-
return;
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
export { GameDetails as default };
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
import { Args, Flags } from '@oclif/core';
|
|
2
|
-
import { B as BaseAuthenticatedCommand, j as isCWDGodotGame, I as getProject, w as DEFAULT_IGNORED_FILES_GLOBS, x as DEFAULT_SHIPPED_FILES_GLOBS } from '../../index-DkNQs11R.js';
|
|
3
|
-
import 'crypto';
|
|
4
|
-
import 'fs';
|
|
5
|
-
import 'readline-sync';
|
|
6
|
-
import 'node:readline';
|
|
7
|
-
import 'node:path';
|
|
8
|
-
import 'node:url';
|
|
9
|
-
import 'luxon';
|
|
10
|
-
import 'axios';
|
|
11
|
-
import 'isomorphic-git';
|
|
12
|
-
import 'react';
|
|
13
|
-
import '@tanstack/react-query';
|
|
14
|
-
import 'uuid';
|
|
15
|
-
import 'fast-glob';
|
|
16
|
-
import 'yazl';
|
|
17
|
-
import 'socket.io-client';
|
|
18
|
-
import 'path';
|
|
19
|
-
import '@expo/apple-utils/build/index.js';
|
|
20
|
-
import 'crypto-js';
|
|
21
|
-
import 'ini';
|
|
22
|
-
import 'deepmerge';
|
|
23
|
-
|
|
24
|
-
class GameExport extends BaseAuthenticatedCommand {
|
|
25
|
-
static args = {
|
|
26
|
-
game_id: Args.string({ description: 'The ID of the game to export (use "list" to get the ID)', required: true })
|
|
27
|
-
};
|
|
28
|
-
static description = "Downloads the shipthis.json file for a given game into the current directory.";
|
|
29
|
-
static examples = [
|
|
30
|
-
"<%= config.bin %> <%= command.id %> abcd1234",
|
|
31
|
-
"<%= config.bin %> <%= command.id %> abcd1234 --force"
|
|
32
|
-
];
|
|
33
|
-
static flags = {
|
|
34
|
-
force: Flags.boolean({ char: "f" })
|
|
35
|
-
};
|
|
36
|
-
async run() {
|
|
37
|
-
const { args } = this;
|
|
38
|
-
if (!isCWDGodotGame()) {
|
|
39
|
-
return this.error("No Godot project detected. Please run this from a godot project directory.", { exit: 1 });
|
|
40
|
-
}
|
|
41
|
-
if (this.hasProjectConfig() && !this.flags.force) {
|
|
42
|
-
return this.error(
|
|
43
|
-
"This project has already been initialized. Use --force to overwrite the existing configuration.",
|
|
44
|
-
{ exit: 1 }
|
|
45
|
-
);
|
|
46
|
-
}
|
|
47
|
-
const project = await getProject(args.game_id);
|
|
48
|
-
await this.setProjectConfig({
|
|
49
|
-
project,
|
|
50
|
-
shippedFilesGlobs: DEFAULT_SHIPPED_FILES_GLOBS,
|
|
51
|
-
ignoredFilesGlobs: DEFAULT_IGNORED_FILES_GLOBS
|
|
52
|
-
});
|
|
53
|
-
await this.config.runCommand("game:status");
|
|
54
|
-
this.exit(0);
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
export { GameExport as default };
|
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
import { jsx } from 'react/jsx-runtime';
|
|
2
|
-
import { render } from 'ink';
|
|
3
|
-
import { Flags } from '@oclif/core';
|
|
4
|
-
import 'react';
|
|
5
|
-
import '../../../../index-vMXsdSCy.js';
|
|
6
|
-
import { c as BaseGameCommand, i as BetaGroup } from '../../../../index-DkNQs11R.js';
|
|
7
|
-
import 'ink-spinner';
|
|
8
|
-
import 'axios';
|
|
9
|
-
import 'crypto-js';
|
|
10
|
-
import 'uuid';
|
|
11
|
-
import 'fs';
|
|
12
|
-
import 'luxon';
|
|
13
|
-
import '@inkjs/ui';
|
|
14
|
-
import '@tanstack/react-query';
|
|
15
|
-
import 'yazl';
|
|
16
|
-
import { a as getInput } from '../../../../index-BB00V5oF.js';
|
|
17
|
-
import 'open';
|
|
18
|
-
import 'marked';
|
|
19
|
-
import 'marked-terminal';
|
|
20
|
-
import 'path';
|
|
21
|
-
import 'qrcode';
|
|
22
|
-
import { R as RunWithSpinner } from '../../../../RunWithSpinner-BVXNWGD3.js';
|
|
23
|
-
import 'string-length';
|
|
24
|
-
import 'strip-ansi';
|
|
25
|
-
import { q as queryAppleApp } from '../../../../useAppleApp-B16WbUxJ.js';
|
|
26
|
-
import 'fast-glob';
|
|
27
|
-
import { C as Command } from '../../../../Command-BQCJ9Wf-.js';
|
|
28
|
-
import 'socket.io-client';
|
|
29
|
-
import '../../../../useAndroidServiceAccountTestResult-DcYDam-p.js';
|
|
30
|
-
import '@expo/apple-utils/build/index.js';
|
|
31
|
-
import 'crypto';
|
|
32
|
-
import 'readline-sync';
|
|
33
|
-
import 'node:readline';
|
|
34
|
-
import 'node:path';
|
|
35
|
-
import 'node:url';
|
|
36
|
-
import 'isomorphic-git';
|
|
37
|
-
import 'ini';
|
|
38
|
-
import 'deepmerge';
|
|
39
|
-
|
|
40
|
-
const TEST_GROUP_NAME = "ShipThis Test Group";
|
|
41
|
-
class GameIosAppAddTester extends BaseGameCommand {
|
|
42
|
-
static args = {};
|
|
43
|
-
static description = "Adds a test user to the game in App Store Connect.";
|
|
44
|
-
static examples = ["<%= config.bin %> <%= command.id %>"];
|
|
45
|
-
static flags = {
|
|
46
|
-
gameId: Flags.string({ char: "g", description: "The ID of the game" }),
|
|
47
|
-
email: Flags.string({ char: "e", description: "The email address of the tester" }),
|
|
48
|
-
firstName: Flags.string({ char: "f", description: "The first name of the tester" }),
|
|
49
|
-
lastName: Flags.string({ char: "l", description: "The last name of the tester" })
|
|
50
|
-
};
|
|
51
|
-
async run() {
|
|
52
|
-
const game = await this.getGame();
|
|
53
|
-
const authState = await this.refreshAppleAuthState();
|
|
54
|
-
const ctx = authState.context;
|
|
55
|
-
const { flags } = this;
|
|
56
|
-
const getEmail = async () => {
|
|
57
|
-
if (flags.email) return flags.email;
|
|
58
|
-
const question = `Please enter the email address of the tester: `;
|
|
59
|
-
const enteredEmail = await getInput(question);
|
|
60
|
-
if (!enteredEmail) {
|
|
61
|
-
this.error("No email address provided");
|
|
62
|
-
}
|
|
63
|
-
return enteredEmail;
|
|
64
|
-
};
|
|
65
|
-
const getFirstName = async () => {
|
|
66
|
-
if (flags.firstName) return flags.firstName;
|
|
67
|
-
const suggestedName = "John";
|
|
68
|
-
const question = `Please enter the first name of the tester, or press enter to use ${suggestedName}: `;
|
|
69
|
-
const enteredName = await getInput(question);
|
|
70
|
-
return enteredName || suggestedName;
|
|
71
|
-
};
|
|
72
|
-
const getLastName = async () => {
|
|
73
|
-
if (flags.lastName) return flags.lastName;
|
|
74
|
-
const suggestedName = "Doe";
|
|
75
|
-
const question = `Please enter the last name of the tester, or press enter to use ${suggestedName}: `;
|
|
76
|
-
const enteredName = await getInput(question);
|
|
77
|
-
return enteredName || suggestedName;
|
|
78
|
-
};
|
|
79
|
-
const email = await getEmail();
|
|
80
|
-
const firstName = await getFirstName();
|
|
81
|
-
const lastName = await getLastName();
|
|
82
|
-
console.warn("This command does not yet work. It fails with an assertion error.");
|
|
83
|
-
const addTestUser = async () => {
|
|
84
|
-
const { app } = await queryAppleApp({ ctx, iosBundleId: game.details?.iosBundleId });
|
|
85
|
-
if (!app) return this.error("No app found");
|
|
86
|
-
const groups = await BetaGroup.getAsync(ctx, {});
|
|
87
|
-
let shipThisGroup = groups.find(
|
|
88
|
-
(group) => group.attributes.name === TEST_GROUP_NAME && group.attributes.isInternalGroup
|
|
89
|
-
);
|
|
90
|
-
if (!shipThisGroup) {
|
|
91
|
-
shipThisGroup = await BetaGroup.createAsync(ctx, {
|
|
92
|
-
id: app.id,
|
|
93
|
-
name: TEST_GROUP_NAME,
|
|
94
|
-
isInternalGroup: true,
|
|
95
|
-
publicLinkEnabled: false,
|
|
96
|
-
publicLinkLimit: 1,
|
|
97
|
-
publicLinkLimitEnabled: false
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
await shipThisGroup.createBulkBetaTesterAssignmentsAsync([
|
|
101
|
-
{
|
|
102
|
-
email,
|
|
103
|
-
firstName,
|
|
104
|
-
lastName
|
|
105
|
-
}
|
|
106
|
-
]);
|
|
107
|
-
};
|
|
108
|
-
const handleComplete = async () => {
|
|
109
|
-
};
|
|
110
|
-
render(
|
|
111
|
-
/* @__PURE__ */ jsx(Command, { command: this, children: /* @__PURE__ */ jsx(
|
|
112
|
-
RunWithSpinner,
|
|
113
|
-
{
|
|
114
|
-
msgInProgress: "Adding test user...",
|
|
115
|
-
msgComplete: "Added test user",
|
|
116
|
-
executeMethod: addTestUser,
|
|
117
|
-
onComplete: handleComplete
|
|
118
|
-
}
|
|
119
|
-
) })
|
|
120
|
-
);
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
export { GameIosAppAddTester as default };
|
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
import { jsx } from 'react/jsx-runtime';
|
|
2
|
-
import { render } from 'ink';
|
|
3
|
-
import { Flags } from '@oclif/core';
|
|
4
|
-
import 'react';
|
|
5
|
-
import '../../../../index-vMXsdSCy.js';
|
|
6
|
-
import { c as BaseGameCommand, d as getGodotAppleBundleIdentifier, e as BundleId, f as App } from '../../../../index-DkNQs11R.js';
|
|
7
|
-
import 'ink-spinner';
|
|
8
|
-
import 'axios';
|
|
9
|
-
import 'crypto-js';
|
|
10
|
-
import 'uuid';
|
|
11
|
-
import 'fs';
|
|
12
|
-
import 'luxon';
|
|
13
|
-
import '@inkjs/ui';
|
|
14
|
-
import '@tanstack/react-query';
|
|
15
|
-
import 'yazl';
|
|
16
|
-
import { a as getInput, b as generatePackageName } from '../../../../index-BB00V5oF.js';
|
|
17
|
-
import 'open';
|
|
18
|
-
import 'marked';
|
|
19
|
-
import 'marked-terminal';
|
|
20
|
-
import 'path';
|
|
21
|
-
import 'qrcode';
|
|
22
|
-
import { R as RunWithSpinner } from '../../../../RunWithSpinner-BVXNWGD3.js';
|
|
23
|
-
import 'string-length';
|
|
24
|
-
import 'strip-ansi';
|
|
25
|
-
import 'fast-glob';
|
|
26
|
-
import { C as Command } from '../../../../Command-BQCJ9Wf-.js';
|
|
27
|
-
import 'socket.io-client';
|
|
28
|
-
import '../../../../useAndroidServiceAccountTestResult-DcYDam-p.js';
|
|
29
|
-
import '@expo/apple-utils/build/index.js';
|
|
30
|
-
import 'crypto';
|
|
31
|
-
import 'readline-sync';
|
|
32
|
-
import 'node:readline';
|
|
33
|
-
import 'node:path';
|
|
34
|
-
import 'node:url';
|
|
35
|
-
import 'isomorphic-git';
|
|
36
|
-
import 'ini';
|
|
37
|
-
import 'deepmerge';
|
|
38
|
-
|
|
39
|
-
class GameIosAppCreate extends BaseGameCommand {
|
|
40
|
-
static args = {};
|
|
41
|
-
static description = "Creates an App and BundleId in the Apple Developer Portal.";
|
|
42
|
-
static examples = ["<%= config.bin %> <%= command.id %>"];
|
|
43
|
-
static flags = {
|
|
44
|
-
quiet: Flags.boolean({ char: "q", description: "Avoid output except for interactions and errors" }),
|
|
45
|
-
gameId: Flags.string({ char: "g", description: "The ID of the game" }),
|
|
46
|
-
appName: Flags.string({ char: "n", description: "The name of the App in the Apple Developer Portal" }),
|
|
47
|
-
bundleId: Flags.string({ char: "b", description: "The BundleId in the Apple Developer Portal" }),
|
|
48
|
-
force: Flags.boolean({ char: "f" })
|
|
49
|
-
// not used but don't remove or the wizard breaks
|
|
50
|
-
};
|
|
51
|
-
async run() {
|
|
52
|
-
const game = await this.getGame();
|
|
53
|
-
const authState = await this.refreshAppleAuthState();
|
|
54
|
-
const ctx = authState.context;
|
|
55
|
-
const { flags } = this;
|
|
56
|
-
const { appName, bundleId } = flags;
|
|
57
|
-
const getAppName = async () => {
|
|
58
|
-
if (appName) return appName;
|
|
59
|
-
const suggestedName = game.name;
|
|
60
|
-
const question = `Please enter the name of the App in the Apple Developer Portal, or press enter to use ${suggestedName}: `;
|
|
61
|
-
const enteredName = await getInput(question);
|
|
62
|
-
return enteredName || suggestedName;
|
|
63
|
-
};
|
|
64
|
-
const getBundleIdentifier = async () => {
|
|
65
|
-
if (bundleId) return bundleId;
|
|
66
|
-
const generatedBundleId = generatePackageName(game.name);
|
|
67
|
-
const suggestedBundleId = game.details?.iosBundleId || getGodotAppleBundleIdentifier() || generatedBundleId || "com.example.game";
|
|
68
|
-
const question = `Please enter the BundleId in the Apple Developer Portal, or press enter to use ${suggestedBundleId}: `;
|
|
69
|
-
const enteredBundleId = await getInput(question);
|
|
70
|
-
return enteredBundleId || suggestedBundleId;
|
|
71
|
-
};
|
|
72
|
-
const name = await getAppName();
|
|
73
|
-
const iosBundleId = await getBundleIdentifier();
|
|
74
|
-
const createApp = async () => {
|
|
75
|
-
this.log(`Checking for ${iosBundleId} in apple portal...`);
|
|
76
|
-
let bundleId2 = await BundleId.findAsync(ctx, { identifier: iosBundleId });
|
|
77
|
-
if (!bundleId2) {
|
|
78
|
-
this.log(`Creating BundleId ${iosBundleId} in apple portal...`);
|
|
79
|
-
bundleId2 = await BundleId.createAsync(ctx, {
|
|
80
|
-
identifier: iosBundleId,
|
|
81
|
-
name
|
|
82
|
-
});
|
|
83
|
-
}
|
|
84
|
-
let app = await App.findAsync(ctx, {
|
|
85
|
-
bundleId: iosBundleId
|
|
86
|
-
});
|
|
87
|
-
if (!app) {
|
|
88
|
-
this.log(`Creating App ${iosBundleId} in apple portal...`);
|
|
89
|
-
app = await App.createAsync(ctx, {
|
|
90
|
-
bundleId: iosBundleId,
|
|
91
|
-
name,
|
|
92
|
-
primaryLocale: "en-US"
|
|
93
|
-
// TODO
|
|
94
|
-
});
|
|
95
|
-
}
|
|
96
|
-
await this.updateGame({ details: { ...game.details, iosBundleId } });
|
|
97
|
-
};
|
|
98
|
-
const handleComplete = async () => {
|
|
99
|
-
await this.config.runCommand("game:ios:app:sync", ["--gameId", game.id]);
|
|
100
|
-
process.exit(0);
|
|
101
|
-
};
|
|
102
|
-
if (this.flags.quiet) return await createApp();
|
|
103
|
-
render(
|
|
104
|
-
/* @__PURE__ */ jsx(Command, { command: this, children: /* @__PURE__ */ jsx(
|
|
105
|
-
RunWithSpinner,
|
|
106
|
-
{
|
|
107
|
-
msgInProgress: "Creating App and BundleId in the Apple Developer Portal",
|
|
108
|
-
msgComplete: "App and BundleId created",
|
|
109
|
-
executeMethod: createApp,
|
|
110
|
-
onComplete: handleComplete
|
|
111
|
-
}
|
|
112
|
-
) })
|
|
113
|
-
);
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
export { GameIosAppCreate as default };
|