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.
Files changed (89) hide show
  1. package/README.md +25 -16
  2. package/docs/assets/ship-outputx0.8.gif +0 -0
  3. package/package.json +1 -1
  4. package/bin/readme.sh +0 -15
  5. package/dist/AppleBundleIdDetails-C9C5WSPR.js +0 -76
  6. package/dist/Command-BQCJ9Wf-.js +0 -28
  7. package/dist/CommandGame-CkGqTno0.js +0 -9
  8. package/dist/Create-t_E231OA.js +0 -59
  9. package/dist/Import-Ljz1gxXd.js +0 -110
  10. package/dist/JobProgress-D9tHgBvi.js +0 -121
  11. package/dist/JobStatusTable-DmI7qCHc.js +0 -203
  12. package/dist/NextSteps-CK9zHOCt.js +0 -18
  13. package/dist/ProgressSpinner-6pw1T8Iw.js +0 -16
  14. package/dist/ProjectCredentialsTable-CTkP1mvy.js +0 -37
  15. package/dist/RunWithSpinner-BVXNWGD3.js +0 -27
  16. package/dist/StatusTable-Dm5St4g-.js +0 -33
  17. package/dist/Table-CvM6pccN.js +0 -101
  18. package/dist/Title-BCQtayg6.js +0 -6
  19. package/dist/UserCredentialsTable-DhtM_iTG.js +0 -82
  20. package/dist/baseAppleCommand-IGl6KTvv.js +0 -10
  21. package/dist/baseGameAndroidCommand-DFn4zMvq.js +0 -43
  22. package/dist/commands/apple/apiKey/create.js +0 -103
  23. package/dist/commands/apple/apiKey/export.js +0 -81
  24. package/dist/commands/apple/apiKey/import.js +0 -85
  25. package/dist/commands/apple/apiKey/status.js +0 -122
  26. package/dist/commands/apple/certificate/create.js +0 -133
  27. package/dist/commands/apple/certificate/export.js +0 -81
  28. package/dist/commands/apple/certificate/import.js +0 -85
  29. package/dist/commands/apple/certificate/status.js +0 -130
  30. package/dist/commands/apple/login.js +0 -76
  31. package/dist/commands/apple/status.js +0 -79
  32. package/dist/commands/dashboard.js +0 -38
  33. package/dist/commands/game/android/apiKey/connect.js +0 -74
  34. package/dist/commands/game/android/apiKey/create.js +0 -74
  35. package/dist/commands/game/android/apiKey/export.js +0 -84
  36. package/dist/commands/game/android/apiKey/import.js +0 -93
  37. package/dist/commands/game/android/apiKey/invite.js +0 -81
  38. package/dist/commands/game/android/apiKey/status.js +0 -87
  39. package/dist/commands/game/android/keyStore/create.js +0 -69
  40. package/dist/commands/game/android/keyStore/export.js +0 -83
  41. package/dist/commands/game/android/keyStore/import.js +0 -112
  42. package/dist/commands/game/android/keyStore/status.js +0 -70
  43. package/dist/commands/game/android/status.js +0 -84
  44. package/dist/commands/game/build/download.js +0 -80
  45. package/dist/commands/game/build/list.js +0 -94
  46. package/dist/commands/game/create.js +0 -67
  47. package/dist/commands/game/details.js +0 -113
  48. package/dist/commands/game/export.js +0 -58
  49. package/dist/commands/game/ios/app/addTester.js +0 -124
  50. package/dist/commands/game/ios/app/create.js +0 -117
  51. package/dist/commands/game/ios/app/status.js +0 -66
  52. package/dist/commands/game/ios/app/sync.js +0 -95
  53. package/dist/commands/game/ios/profile/create.js +0 -129
  54. package/dist/commands/game/ios/profile/export.js +0 -83
  55. package/dist/commands/game/ios/profile/import.js +0 -92
  56. package/dist/commands/game/ios/profile/status.js +0 -139
  57. package/dist/commands/game/ios/status.js +0 -92
  58. package/dist/commands/game/ios/wizard.js +0 -153
  59. package/dist/commands/game/job/list.js +0 -91
  60. package/dist/commands/game/job/status.js +0 -91
  61. package/dist/commands/game/list.js +0 -83
  62. package/dist/commands/game/ship.js +0 -205
  63. package/dist/commands/game/status.js +0 -114
  64. package/dist/commands/game/wizard.js +0 -686
  65. package/dist/commands/internal/fastlane.js +0 -74
  66. package/dist/commands/internal/readme.js +0 -937
  67. package/dist/commands/login.js +0 -92
  68. package/dist/commands/status.js +0 -76
  69. package/dist/export-CVs_xoDN.js +0 -36
  70. package/dist/git-DREGq-jc.js +0 -32
  71. package/dist/import-Ch5O7xfN.js +0 -47
  72. package/dist/index-BB00V5oF.js +0 -136
  73. package/dist/index-CIa2EDQ6.js +0 -24
  74. package/dist/index-DkNQs11R.js +0 -711
  75. package/dist/index-DrcGhlrc.js +0 -138
  76. package/dist/index-DyOv-ge5.js +0 -125
  77. package/dist/index-vMXsdSCy.js +0 -208
  78. package/dist/index.d.ts +0 -1
  79. package/dist/index.js +0 -1
  80. package/dist/upload-CRE2nVdd.js +0 -60
  81. package/dist/useAndroidServiceAccountTestResult-DcYDam-p.js +0 -52
  82. package/dist/useAppleApp-B16WbUxJ.js +0 -32
  83. package/dist/useAppleBundleId-DobPATan.js +0 -64
  84. package/dist/useJobWatching-BZSUa8E-.js +0 -45
  85. package/dist/useProjectCredentials-Btnr7WK3.js +0 -54
  86. package/dist/useWebSocket-ByuNoqRw.js +0 -36
  87. package/dist/utils/help.js +0 -14
  88. package/npm-shrinkwrap.json +0 -14011
  89. 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 };