@minecraft-docker/mcctl 1.6.0 → 1.6.2
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/dist/application/index.d.ts +2 -0
- package/dist/application/index.d.ts.map +1 -0
- package/dist/application/index.js +5 -0
- package/dist/application/index.js.map +1 -0
- package/dist/commands/backup.d.ts +16 -0
- package/dist/commands/backup.d.ts.map +1 -0
- package/dist/commands/backup.js +182 -0
- package/dist/commands/backup.js.map +1 -0
- package/dist/commands/ban.d.ts +14 -0
- package/dist/commands/ban.d.ts.map +1 -0
- package/dist/commands/ban.js +418 -0
- package/dist/commands/ban.js.map +1 -0
- package/dist/commands/config.d.ts +18 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +106 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/console/api.d.ts +19 -0
- package/dist/commands/console/api.d.ts.map +1 -0
- package/dist/commands/console/api.js +399 -0
- package/dist/commands/console/api.js.map +1 -0
- package/dist/commands/console/index.d.ts +10 -0
- package/dist/commands/console/index.d.ts.map +1 -0
- package/dist/commands/console/index.js +12 -0
- package/dist/commands/console/index.js.map +1 -0
- package/dist/commands/console/init.d.ts +47 -0
- package/dist/commands/console/init.d.ts.map +1 -0
- package/dist/commands/console/init.js +491 -0
- package/dist/commands/console/init.js.map +1 -0
- package/dist/commands/console/remove.d.ts +25 -0
- package/dist/commands/console/remove.d.ts.map +1 -0
- package/dist/commands/console/remove.js +189 -0
- package/dist/commands/console/remove.js.map +1 -0
- package/dist/commands/console/service.d.ts +40 -0
- package/dist/commands/console/service.d.ts.map +1 -0
- package/dist/commands/console/service.js +321 -0
- package/dist/commands/console/service.js.map +1 -0
- package/dist/commands/console/user.d.ts +17 -0
- package/dist/commands/console/user.d.ts.map +1 -0
- package/dist/commands/console/user.js +431 -0
- package/dist/commands/console/user.js.map +1 -0
- package/dist/commands/create.d.ts +22 -0
- package/dist/commands/create.d.ts.map +1 -0
- package/dist/commands/create.js +86 -0
- package/dist/commands/create.js.map +1 -0
- package/dist/commands/delete.d.ts +17 -0
- package/dist/commands/delete.d.ts.map +1 -0
- package/dist/commands/delete.js +74 -0
- package/dist/commands/delete.js.map +1 -0
- package/dist/commands/exec.d.ts +10 -0
- package/dist/commands/exec.d.ts.map +1 -0
- package/dist/commands/exec.js +29 -0
- package/dist/commands/exec.js.map +1 -0
- package/dist/commands/index.d.ts +21 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +23 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/init.d.ts +9 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +218 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/kick.d.ts +12 -0
- package/dist/commands/kick.d.ts.map +1 -0
- package/dist/commands/kick.js +71 -0
- package/dist/commands/kick.js.map +1 -0
- package/dist/commands/migrate.d.ts +18 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +470 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/mod.d.ts +19 -0
- package/dist/commands/mod.d.ts.map +1 -0
- package/dist/commands/mod.js +441 -0
- package/dist/commands/mod.js.map +1 -0
- package/dist/commands/msg.d.ts +12 -0
- package/dist/commands/msg.d.ts.map +1 -0
- package/dist/commands/msg.js +273 -0
- package/dist/commands/msg.js.map +1 -0
- package/dist/commands/op.d.ts +12 -0
- package/dist/commands/op.d.ts.map +1 -0
- package/dist/commands/op.js +220 -0
- package/dist/commands/op.js.map +1 -0
- package/dist/commands/player-online.d.ts +11 -0
- package/dist/commands/player-online.d.ts.map +1 -0
- package/dist/commands/player-online.js +153 -0
- package/dist/commands/player-online.js.map +1 -0
- package/dist/commands/player.d.ts +18 -0
- package/dist/commands/player.d.ts.map +1 -0
- package/dist/commands/player.js +352 -0
- package/dist/commands/player.js.map +1 -0
- package/dist/commands/server-backup.d.ts +36 -0
- package/dist/commands/server-backup.d.ts.map +1 -0
- package/dist/commands/server-backup.js +320 -0
- package/dist/commands/server-backup.js.map +1 -0
- package/dist/commands/server-restore.d.ts +13 -0
- package/dist/commands/server-restore.d.ts.map +1 -0
- package/dist/commands/server-restore.js +294 -0
- package/dist/commands/server-restore.js.map +1 -0
- package/dist/commands/status.d.ts +13 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +325 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/whitelist.d.ts +12 -0
- package/dist/commands/whitelist.d.ts.map +1 -0
- package/dist/commands/whitelist.js +316 -0
- package/dist/commands/whitelist.js.map +1 -0
- package/dist/commands/world.d.ts +18 -0
- package/dist/commands/world.d.ts.map +1 -0
- package/dist/commands/world.js +238 -0
- package/dist/commands/world.js.map +1 -0
- package/dist/domain/index.d.ts +2 -0
- package/dist/domain/index.d.ts.map +1 -0
- package/dist/domain/index.js +7 -0
- package/dist/domain/index.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +766 -0
- package/dist/index.js.map +1 -0
- package/dist/infrastructure/adapters/ClackPromptAdapter.d.ts +30 -0
- package/dist/infrastructure/adapters/ClackPromptAdapter.d.ts.map +1 -0
- package/dist/infrastructure/adapters/ClackPromptAdapter.js +430 -0
- package/dist/infrastructure/adapters/ClackPromptAdapter.js.map +1 -0
- package/dist/infrastructure/adapters/Pm2ServiceManagerAdapter.d.ts +78 -0
- package/dist/infrastructure/adapters/Pm2ServiceManagerAdapter.d.ts.map +1 -0
- package/dist/infrastructure/adapters/Pm2ServiceManagerAdapter.js +391 -0
- package/dist/infrastructure/adapters/Pm2ServiceManagerAdapter.js.map +1 -0
- package/dist/infrastructure/adapters/index.d.ts +4 -0
- package/dist/infrastructure/adapters/index.d.ts.map +1 -0
- package/dist/infrastructure/adapters/index.js +6 -0
- package/dist/infrastructure/adapters/index.js.map +1 -0
- package/dist/infrastructure/di/container.d.ts +47 -0
- package/dist/infrastructure/di/container.d.ts.map +1 -0
- package/dist/infrastructure/di/container.js +140 -0
- package/dist/infrastructure/di/container.js.map +1 -0
- package/dist/infrastructure/di/index.d.ts +2 -0
- package/dist/infrastructure/di/index.d.ts.map +1 -0
- package/dist/infrastructure/di/index.js +2 -0
- package/dist/infrastructure/di/index.js.map +1 -0
- package/dist/infrastructure/index.d.ts +5 -0
- package/dist/infrastructure/index.d.ts.map +1 -0
- package/dist/infrastructure/index.js +8 -0
- package/dist/infrastructure/index.js.map +1 -0
- package/dist/lib/admin-config.d.ts +66 -0
- package/dist/lib/admin-config.d.ts.map +1 -0
- package/dist/lib/admin-config.js +130 -0
- package/dist/lib/admin-config.js.map +1 -0
- package/dist/lib/mojang-api.d.ts +51 -0
- package/dist/lib/mojang-api.d.ts.map +1 -0
- package/dist/lib/mojang-api.js +136 -0
- package/dist/lib/mojang-api.js.map +1 -0
- package/dist/lib/player-cache.d.ts +79 -0
- package/dist/lib/player-cache.d.ts.map +1 -0
- package/dist/lib/player-cache.js +302 -0
- package/dist/lib/player-cache.js.map +1 -0
- package/dist/lib/player-json.d.ts +69 -0
- package/dist/lib/player-json.d.ts.map +1 -0
- package/dist/lib/player-json.js +96 -0
- package/dist/lib/player-json.js.map +1 -0
- package/dist/lib/pm2-utils.d.ts +71 -0
- package/dist/lib/pm2-utils.d.ts.map +1 -0
- package/dist/lib/pm2-utils.js +155 -0
- package/dist/lib/pm2-utils.js.map +1 -0
- package/dist/lib/prompts/action-select.d.ts +23 -0
- package/dist/lib/prompts/action-select.d.ts.map +1 -0
- package/dist/lib/prompts/action-select.js +124 -0
- package/dist/lib/prompts/action-select.js.map +1 -0
- package/dist/lib/prompts/index.d.ts +7 -0
- package/dist/lib/prompts/index.d.ts.map +1 -0
- package/dist/lib/prompts/index.js +7 -0
- package/dist/lib/prompts/index.js.map +1 -0
- package/dist/lib/prompts/ip-select.d.ts +25 -0
- package/dist/lib/prompts/ip-select.d.ts.map +1 -0
- package/dist/lib/prompts/ip-select.js +255 -0
- package/dist/lib/prompts/ip-select.js.map +1 -0
- package/dist/lib/prompts/player-select.d.ts +25 -0
- package/dist/lib/prompts/player-select.d.ts.map +1 -0
- package/dist/lib/prompts/player-select.js +122 -0
- package/dist/lib/prompts/player-select.js.map +1 -0
- package/dist/lib/prompts/server-select.d.ts +26 -0
- package/dist/lib/prompts/server-select.d.ts.map +1 -0
- package/dist/lib/prompts/server-select.js +99 -0
- package/dist/lib/prompts/server-select.js.map +1 -0
- package/dist/lib/rcon.d.ts +53 -0
- package/dist/lib/rcon.d.ts.map +1 -0
- package/dist/lib/rcon.js +131 -0
- package/dist/lib/rcon.js.map +1 -0
- package/dist/lib/shell.d.ts +111 -0
- package/dist/lib/shell.d.ts.map +1 -0
- package/dist/lib/shell.js +321 -0
- package/dist/lib/shell.js.map +1 -0
- package/dist/lib/sudo-utils.d.ts +14 -0
- package/dist/lib/sudo-utils.d.ts.map +1 -0
- package/dist/lib/sudo-utils.js +53 -0
- package/dist/lib/sudo-utils.js.map +1 -0
- package/package.json +8 -2
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PM2 Utility Functions
|
|
3
|
+
*
|
|
4
|
+
* Helper functions for PM2 operations including:
|
|
5
|
+
* - PM2 installation check
|
|
6
|
+
* - PM2 connection management
|
|
7
|
+
* - Ecosystem config path resolution
|
|
8
|
+
*/
|
|
9
|
+
import { spawnSync } from 'node:child_process';
|
|
10
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
11
|
+
import { join } from 'node:path';
|
|
12
|
+
/**
|
|
13
|
+
* Default ecosystem config filename
|
|
14
|
+
*/
|
|
15
|
+
export const ECOSYSTEM_CONFIG_FILE = 'ecosystem.config.cjs';
|
|
16
|
+
/**
|
|
17
|
+
* PM2 service names
|
|
18
|
+
*/
|
|
19
|
+
export const PM2_SERVICE_NAMES = {
|
|
20
|
+
API: 'mcctl-api',
|
|
21
|
+
CONSOLE: 'mcctl-console',
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Check if PM2 is installed (globally or as a dependency)
|
|
25
|
+
* @returns Object with installation status and version
|
|
26
|
+
*/
|
|
27
|
+
export function checkPm2Installation() {
|
|
28
|
+
// First check if pm2 is available in PATH (global installation)
|
|
29
|
+
const globalResult = spawnSync('which', ['pm2'], {
|
|
30
|
+
encoding: 'utf-8',
|
|
31
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
32
|
+
});
|
|
33
|
+
if (globalResult.status === 0 && globalResult.stdout) {
|
|
34
|
+
const pm2Path = globalResult.stdout.trim();
|
|
35
|
+
// Get version
|
|
36
|
+
const versionResult = spawnSync('pm2', ['--version'], {
|
|
37
|
+
encoding: 'utf-8',
|
|
38
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
39
|
+
});
|
|
40
|
+
return {
|
|
41
|
+
installed: true,
|
|
42
|
+
path: pm2Path,
|
|
43
|
+
version: versionResult.status === 0 ? versionResult.stdout.trim() : undefined,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
// Check if pm2 module can be imported (local installation via npm)
|
|
47
|
+
// The pm2 programmatic API works without global installation
|
|
48
|
+
try {
|
|
49
|
+
// We already have pm2 as a dependency, so it's always available
|
|
50
|
+
// Just return true - the actual PM2 operations will work via the API
|
|
51
|
+
return {
|
|
52
|
+
installed: true,
|
|
53
|
+
version: 'local',
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return { installed: false };
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Get the ecosystem config path for the given platform
|
|
62
|
+
* @param paths - Paths instance
|
|
63
|
+
* @returns Absolute path to ecosystem.config.cjs
|
|
64
|
+
*/
|
|
65
|
+
export function getEcosystemConfigPath(paths) {
|
|
66
|
+
return join(paths.platform, ECOSYSTEM_CONFIG_FILE);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Check if ecosystem config exists
|
|
70
|
+
* @param paths - Paths instance
|
|
71
|
+
* @returns true if config exists
|
|
72
|
+
*/
|
|
73
|
+
export function ecosystemConfigExists(paths) {
|
|
74
|
+
return existsSync(getEcosystemConfigPath(paths));
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Get PM2 log file paths for a service
|
|
78
|
+
* @param paths - Paths instance
|
|
79
|
+
* @param serviceName - Service name
|
|
80
|
+
* @returns Object with output and error log paths
|
|
81
|
+
*/
|
|
82
|
+
export function getPm2LogPaths(paths, serviceName) {
|
|
83
|
+
const logsDir = join(paths.platform, 'logs');
|
|
84
|
+
return {
|
|
85
|
+
output: join(logsDir, `${serviceName}-out.log`),
|
|
86
|
+
error: join(logsDir, `${serviceName}-error.log`),
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Read log file content
|
|
91
|
+
* @param logPath - Path to log file
|
|
92
|
+
* @param lines - Number of lines to read (default: 100)
|
|
93
|
+
* @returns Log content
|
|
94
|
+
*/
|
|
95
|
+
export function readLogFile(logPath, lines = 100) {
|
|
96
|
+
if (!existsSync(logPath)) {
|
|
97
|
+
return '';
|
|
98
|
+
}
|
|
99
|
+
try {
|
|
100
|
+
const content = readFileSync(logPath, 'utf-8');
|
|
101
|
+
const allLines = content.split('\n');
|
|
102
|
+
const startIndex = Math.max(0, allLines.length - lines);
|
|
103
|
+
return allLines.slice(startIndex).join('\n');
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
return '';
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Format PM2 error for user-friendly display
|
|
111
|
+
* @param error - Error object
|
|
112
|
+
* @returns Formatted error message
|
|
113
|
+
*/
|
|
114
|
+
export function formatPm2Error(error) {
|
|
115
|
+
if (error instanceof Error) {
|
|
116
|
+
// Common PM2 errors
|
|
117
|
+
if (error.message.includes('ENOENT')) {
|
|
118
|
+
return 'PM2 or the specified script was not found';
|
|
119
|
+
}
|
|
120
|
+
if (error.message.includes('EACCES')) {
|
|
121
|
+
return 'Permission denied. Try running with elevated privileges';
|
|
122
|
+
}
|
|
123
|
+
if (error.message.includes('ECONNREFUSED')) {
|
|
124
|
+
return 'Could not connect to PM2 daemon. It may not be running';
|
|
125
|
+
}
|
|
126
|
+
return error.message;
|
|
127
|
+
}
|
|
128
|
+
return String(error);
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Parse PM2 status to our ServiceStatusEnum
|
|
132
|
+
* @param pm2Status - PM2 process status string
|
|
133
|
+
* @returns Normalized status string
|
|
134
|
+
*/
|
|
135
|
+
export function normalizePm2Status(pm2Status) {
|
|
136
|
+
switch (pm2Status) {
|
|
137
|
+
case 'online':
|
|
138
|
+
return 'online';
|
|
139
|
+
case 'stopping':
|
|
140
|
+
return 'stopping';
|
|
141
|
+
case 'stopped':
|
|
142
|
+
return 'stopped';
|
|
143
|
+
case 'errored':
|
|
144
|
+
return 'errored';
|
|
145
|
+
case 'launching':
|
|
146
|
+
return 'online'; // Treat launching as online for simplicity
|
|
147
|
+
case 'waiting_restart':
|
|
148
|
+
return 'stopping'; // Treat waiting_restart as stopping
|
|
149
|
+
case 'one-launch-status':
|
|
150
|
+
return 'one-launch-status';
|
|
151
|
+
default:
|
|
152
|
+
return 'stopped';
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=pm2-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pm2-utils.js","sourceRoot":"","sources":["../../src/lib/pm2-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Action selection prompt component
|
|
3
|
+
* Reusable prompt for selecting player management actions
|
|
4
|
+
*/
|
|
5
|
+
export type PlayerAction = 'info' | 'whitelist-add' | 'whitelist-remove' | 'op-add' | 'op-remove' | 'ban' | 'unban' | 'kick' | 'back' | 'exit';
|
|
6
|
+
export interface ActionSelectOptions {
|
|
7
|
+
message?: string;
|
|
8
|
+
playerName: string;
|
|
9
|
+
isOnline: boolean;
|
|
10
|
+
isWhitelisted?: boolean;
|
|
11
|
+
isOperator?: boolean;
|
|
12
|
+
isBanned?: boolean;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Prompt user to select an action for a player
|
|
16
|
+
* Returns the selected action or null if cancelled
|
|
17
|
+
*/
|
|
18
|
+
export declare function selectAction(options: ActionSelectOptions): Promise<PlayerAction | null>;
|
|
19
|
+
/**
|
|
20
|
+
* Prompt for continue or another action
|
|
21
|
+
*/
|
|
22
|
+
export declare function promptContinue(playerName: string): Promise<'another' | 'back' | 'exit' | null>;
|
|
23
|
+
//# sourceMappingURL=action-select.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"action-select.d.ts","sourceRoot":"","sources":["../../../src/lib/prompts/action-select.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,MAAM,MAAM,YAAY,GACpB,MAAM,GACN,eAAe,GACf,kBAAkB,GAClB,QAAQ,GACR,WAAW,GACX,KAAK,GACL,OAAO,GACP,MAAM,GACN,MAAM,GACN,MAAM,CAAC;AAEX,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAmED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAgD7F;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC,CAepG"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Action selection prompt component
|
|
3
|
+
* Reusable prompt for selecting player management actions
|
|
4
|
+
*/
|
|
5
|
+
import { select, isCancel } from '@clack/prompts';
|
|
6
|
+
import { colors } from '@minecraft-docker/shared';
|
|
7
|
+
const ACTIONS = [
|
|
8
|
+
{
|
|
9
|
+
value: 'info',
|
|
10
|
+
label: 'View player info',
|
|
11
|
+
hint: 'UUID, skin, status',
|
|
12
|
+
enabled: () => true,
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
value: 'whitelist-add',
|
|
16
|
+
label: 'Add to whitelist',
|
|
17
|
+
enabled: (opts) => !opts.isWhitelisted,
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
value: 'whitelist-remove',
|
|
21
|
+
label: 'Remove from whitelist',
|
|
22
|
+
enabled: (opts) => opts.isWhitelisted === true,
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
value: 'op-add',
|
|
26
|
+
label: 'Add as operator',
|
|
27
|
+
enabled: (opts) => !opts.isOperator,
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
value: 'op-remove',
|
|
31
|
+
label: 'Remove as operator',
|
|
32
|
+
enabled: (opts) => opts.isOperator === true,
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
value: 'ban',
|
|
36
|
+
label: 'Ban player',
|
|
37
|
+
enabled: (opts) => !opts.isBanned,
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
value: 'unban',
|
|
41
|
+
label: 'Unban player',
|
|
42
|
+
enabled: (opts) => opts.isBanned === true,
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
value: 'kick',
|
|
46
|
+
label: 'Kick player',
|
|
47
|
+
hint: 'online only',
|
|
48
|
+
enabled: (opts) => opts.isOnline,
|
|
49
|
+
},
|
|
50
|
+
];
|
|
51
|
+
const NAVIGATION = [
|
|
52
|
+
{
|
|
53
|
+
value: 'back',
|
|
54
|
+
label: '← Back to player selection',
|
|
55
|
+
enabled: () => true,
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
value: 'exit',
|
|
59
|
+
label: '✕ Exit',
|
|
60
|
+
enabled: () => true,
|
|
61
|
+
},
|
|
62
|
+
];
|
|
63
|
+
/**
|
|
64
|
+
* Prompt user to select an action for a player
|
|
65
|
+
* Returns the selected action or null if cancelled
|
|
66
|
+
*/
|
|
67
|
+
export async function selectAction(options) {
|
|
68
|
+
const { message = `Select action for ${options.playerName}:` } = options;
|
|
69
|
+
// Filter enabled actions
|
|
70
|
+
const enabledActions = ACTIONS.filter(action => action.enabled(options));
|
|
71
|
+
// Build options list
|
|
72
|
+
const selectOptions = [];
|
|
73
|
+
for (const action of enabledActions) {
|
|
74
|
+
selectOptions.push({
|
|
75
|
+
value: action.value,
|
|
76
|
+
label: action.label,
|
|
77
|
+
hint: action.hint,
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
// Add separator-like divider
|
|
81
|
+
selectOptions.push({
|
|
82
|
+
value: 'back',
|
|
83
|
+
label: colors.dim('─────────────────'),
|
|
84
|
+
hint: '',
|
|
85
|
+
});
|
|
86
|
+
// Add navigation options
|
|
87
|
+
for (const nav of NAVIGATION) {
|
|
88
|
+
selectOptions.push({
|
|
89
|
+
value: nav.value,
|
|
90
|
+
label: nav.label,
|
|
91
|
+
hint: nav.hint,
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
const selected = await select({
|
|
95
|
+
message,
|
|
96
|
+
options: selectOptions,
|
|
97
|
+
});
|
|
98
|
+
if (isCancel(selected)) {
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
// Handle divider selection (treat as back)
|
|
102
|
+
if (selected.startsWith('─')) {
|
|
103
|
+
return 'back';
|
|
104
|
+
}
|
|
105
|
+
return selected;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Prompt for continue or another action
|
|
109
|
+
*/
|
|
110
|
+
export async function promptContinue(playerName) {
|
|
111
|
+
const selected = await select({
|
|
112
|
+
message: `Another action for ${playerName}?`,
|
|
113
|
+
options: [
|
|
114
|
+
{ value: 'another', label: 'Yes, perform another action' },
|
|
115
|
+
{ value: 'back', label: '← Back to player selection' },
|
|
116
|
+
{ value: 'exit', label: '✕ Exit' },
|
|
117
|
+
],
|
|
118
|
+
});
|
|
119
|
+
if (isCancel(selected)) {
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
return selected;
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=action-select.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"action-select.js","sourceRoot":"","sources":["../../../src/lib/prompts/action-select.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reusable prompt components for CLI
|
|
3
|
+
*/
|
|
4
|
+
export { selectServer, getServerList, type ServerInfo, type ServerSelectOptions } from './server-select.js';
|
|
5
|
+
export { selectPlayer, promptPlayerName, type PlayerSelectOptions, type SelectedPlayer } from './player-select.js';
|
|
6
|
+
export { selectAction, promptContinue, type PlayerAction, type ActionSelectOptions } from './action-select.js';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/prompts/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,KAAK,UAAU,EAAE,KAAK,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC5G,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,KAAK,mBAAmB,EAAE,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACnH,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,KAAK,YAAY,EAAE,KAAK,mBAAmB,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reusable prompt components for CLI
|
|
3
|
+
*/
|
|
4
|
+
export { selectServer, getServerList } from './server-select.js';
|
|
5
|
+
export { selectPlayer, promptPlayerName } from './player-select.js';
|
|
6
|
+
export { selectAction, promptContinue } from './action-select.js';
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/prompts/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,aAAa,EAA6C,MAAM,oBAAoB,CAAC;AAC5G,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAiD,MAAM,oBAAoB,CAAC;AACnH,OAAO,EAAE,YAAY,EAAE,cAAc,EAA+C,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IP address selection prompt component
|
|
3
|
+
* Allows user to select host IP(s) for server hostname routing
|
|
4
|
+
*/
|
|
5
|
+
export interface NetworkInterface {
|
|
6
|
+
name: string;
|
|
7
|
+
address: string;
|
|
8
|
+
family: 'IPv4' | 'IPv6';
|
|
9
|
+
internal: boolean;
|
|
10
|
+
cidr: string | null;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Get all IPv4 addresses from network interfaces
|
|
14
|
+
*/
|
|
15
|
+
export declare function getNetworkInterfaces(): NetworkInterface[];
|
|
16
|
+
/**
|
|
17
|
+
* Prompt user to select IP addresses for server hostname routing
|
|
18
|
+
* Returns selected IPs as comma-separated string, or null if cancelled
|
|
19
|
+
*/
|
|
20
|
+
export declare function selectHostIPs(): Promise<string | null>;
|
|
21
|
+
/**
|
|
22
|
+
* Prompt for single IP selection (simpler version)
|
|
23
|
+
*/
|
|
24
|
+
export declare function selectSingleIP(): Promise<string | null>;
|
|
25
|
+
//# sourceMappingURL=ip-select.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ip-select.d.ts","sourceRoot":"","sources":["../../../src/lib/prompts/ip-select.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,gBAAgB,EAAE,CAsBzD;AAuED;;;GAGG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA+F5D;AAED;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA0E7D"}
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IP address selection prompt component
|
|
3
|
+
* Allows user to select host IP(s) for server hostname routing
|
|
4
|
+
*/
|
|
5
|
+
import { select, multiselect, text, isCancel } from '@clack/prompts';
|
|
6
|
+
import { networkInterfaces } from 'node:os';
|
|
7
|
+
import { colors } from '@minecraft-docker/shared';
|
|
8
|
+
/**
|
|
9
|
+
* Get all IPv4 addresses from network interfaces
|
|
10
|
+
*/
|
|
11
|
+
export function getNetworkInterfaces() {
|
|
12
|
+
const interfaces = networkInterfaces();
|
|
13
|
+
const result = [];
|
|
14
|
+
for (const [name, addrs] of Object.entries(interfaces)) {
|
|
15
|
+
if (!addrs)
|
|
16
|
+
continue;
|
|
17
|
+
for (const addr of addrs) {
|
|
18
|
+
// Only IPv4 and non-internal addresses
|
|
19
|
+
if (addr.family === 'IPv4' && !addr.internal) {
|
|
20
|
+
result.push({
|
|
21
|
+
name,
|
|
22
|
+
address: addr.address,
|
|
23
|
+
family: 'IPv4',
|
|
24
|
+
internal: addr.internal,
|
|
25
|
+
cidr: addr.cidr,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return result;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Detect interface type from name and IP range
|
|
34
|
+
*/
|
|
35
|
+
function detectInterfaceType(iface) {
|
|
36
|
+
const { name, address } = iface;
|
|
37
|
+
const nameLower = name.toLowerCase();
|
|
38
|
+
// VPN detection by interface name
|
|
39
|
+
if (nameLower.includes('tailscale') || nameLower.startsWith('tailscale')) {
|
|
40
|
+
return 'Tailscale VPN';
|
|
41
|
+
}
|
|
42
|
+
if (nameLower.includes('nordlynx') || nameLower.startsWith('nordlynx')) {
|
|
43
|
+
return 'NordVPN Meshnet';
|
|
44
|
+
}
|
|
45
|
+
if (nameLower.includes('nordtun') || nameLower.startsWith('nordtun')) {
|
|
46
|
+
return 'NordVPN';
|
|
47
|
+
}
|
|
48
|
+
if (nameLower.includes('zt') || nameLower.startsWith('zt')) {
|
|
49
|
+
return 'ZeroTier VPN';
|
|
50
|
+
}
|
|
51
|
+
if (nameLower.includes('wg') || nameLower.startsWith('wg')) {
|
|
52
|
+
return 'WireGuard VPN';
|
|
53
|
+
}
|
|
54
|
+
if (nameLower.includes('tun') || nameLower.includes('tap')) {
|
|
55
|
+
return 'VPN Tunnel';
|
|
56
|
+
}
|
|
57
|
+
if (nameLower.includes('nebula')) {
|
|
58
|
+
return 'Nebula VPN';
|
|
59
|
+
}
|
|
60
|
+
// IP range detection for VPNs (100.64.0.0/10 = CGNAT range used by mesh VPNs)
|
|
61
|
+
if (address.startsWith('100.')) {
|
|
62
|
+
// 100.64.0.0 - 100.127.255.255 is CGNAT range
|
|
63
|
+
const secondOctet = parseInt(address.split('.')[1] || '0', 10);
|
|
64
|
+
if (secondOctet >= 64 && secondOctet <= 127) {
|
|
65
|
+
// Could be Tailscale (100.x.x.x) or NordVPN Meshnet (100.64.0.0/10)
|
|
66
|
+
// Check interface name for more specific detection
|
|
67
|
+
if (nameLower.includes('nord')) {
|
|
68
|
+
return 'NordVPN Meshnet';
|
|
69
|
+
}
|
|
70
|
+
return 'Tailscale VPN';
|
|
71
|
+
}
|
|
72
|
+
// Other 100.x.x.x ranges - likely Tailscale
|
|
73
|
+
return 'Tailscale VPN';
|
|
74
|
+
}
|
|
75
|
+
if (address.startsWith('10.147.') || address.startsWith('10.144.')) {
|
|
76
|
+
return 'ZeroTier VPN'; // ZeroTier common ranges
|
|
77
|
+
}
|
|
78
|
+
// Standard interface types
|
|
79
|
+
if (nameLower.includes('docker') || nameLower.startsWith('br-')) {
|
|
80
|
+
return 'Docker Network';
|
|
81
|
+
}
|
|
82
|
+
if (nameLower.includes('veth')) {
|
|
83
|
+
return 'Container';
|
|
84
|
+
}
|
|
85
|
+
if (nameLower.startsWith('eth') || nameLower.startsWith('en')) {
|
|
86
|
+
return 'Ethernet';
|
|
87
|
+
}
|
|
88
|
+
if (nameLower.startsWith('wl') || nameLower.includes('wifi') || nameLower.includes('wlan')) {
|
|
89
|
+
return 'WiFi';
|
|
90
|
+
}
|
|
91
|
+
if (nameLower.startsWith('virbr')) {
|
|
92
|
+
return 'Virtual Bridge';
|
|
93
|
+
}
|
|
94
|
+
return 'Network';
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Prompt user to select IP addresses for server hostname routing
|
|
98
|
+
* Returns selected IPs as comma-separated string, or null if cancelled
|
|
99
|
+
*/
|
|
100
|
+
export async function selectHostIPs() {
|
|
101
|
+
const interfaces = getNetworkInterfaces();
|
|
102
|
+
// Filter out Docker/container interfaces by default
|
|
103
|
+
const relevantInterfaces = interfaces.filter(iface => {
|
|
104
|
+
const name = iface.name.toLowerCase();
|
|
105
|
+
return !name.includes('docker') &&
|
|
106
|
+
!name.startsWith('br-') &&
|
|
107
|
+
!name.includes('veth') &&
|
|
108
|
+
!name.startsWith('virbr');
|
|
109
|
+
});
|
|
110
|
+
if (relevantInterfaces.length === 0) {
|
|
111
|
+
// No interfaces found, prompt for manual input
|
|
112
|
+
const manualInput = await text({
|
|
113
|
+
message: 'No network interfaces detected. Enter IP address manually:',
|
|
114
|
+
placeholder: '192.168.1.100',
|
|
115
|
+
validate: (value) => {
|
|
116
|
+
if (!value)
|
|
117
|
+
return 'IP address is required';
|
|
118
|
+
// Basic IPv4 validation
|
|
119
|
+
const ipv4Regex = /^(\d{1,3}\.){3}\d{1,3}$/;
|
|
120
|
+
if (!ipv4Regex.test(value))
|
|
121
|
+
return 'Invalid IPv4 address format';
|
|
122
|
+
return undefined;
|
|
123
|
+
},
|
|
124
|
+
});
|
|
125
|
+
if (isCancel(manualInput)) {
|
|
126
|
+
return null;
|
|
127
|
+
}
|
|
128
|
+
return manualInput;
|
|
129
|
+
}
|
|
130
|
+
// Build options for multiselect
|
|
131
|
+
const options = relevantInterfaces.map(iface => {
|
|
132
|
+
const type = detectInterfaceType(iface);
|
|
133
|
+
const isVPN = type.includes('VPN');
|
|
134
|
+
const isMain = type === 'Ethernet' || type === 'WiFi';
|
|
135
|
+
return {
|
|
136
|
+
value: iface.address,
|
|
137
|
+
label: `${iface.address}`,
|
|
138
|
+
hint: `${iface.name} (${type})${isMain ? ' - recommended' : ''}${isVPN ? colors.cyan(' VPN') : ''}`,
|
|
139
|
+
};
|
|
140
|
+
});
|
|
141
|
+
// Add manual input option
|
|
142
|
+
options.push({
|
|
143
|
+
value: '__manual__',
|
|
144
|
+
label: 'Enter manually...',
|
|
145
|
+
hint: 'Type an IP address not listed above',
|
|
146
|
+
});
|
|
147
|
+
console.log('');
|
|
148
|
+
console.log(colors.dim(' Select one or more IPs for server hostname routing.'));
|
|
149
|
+
console.log(colors.dim(' Each IP will generate a nip.io hostname (e.g., server.IP.nip.io)'));
|
|
150
|
+
console.log('');
|
|
151
|
+
const selected = await multiselect({
|
|
152
|
+
message: 'Select host IP address(es):',
|
|
153
|
+
options,
|
|
154
|
+
required: true,
|
|
155
|
+
});
|
|
156
|
+
if (isCancel(selected)) {
|
|
157
|
+
return null;
|
|
158
|
+
}
|
|
159
|
+
const selectedIPs = selected;
|
|
160
|
+
// Handle manual input if selected
|
|
161
|
+
if (selectedIPs.includes('__manual__')) {
|
|
162
|
+
const manualInput = await text({
|
|
163
|
+
message: 'Enter additional IP address:',
|
|
164
|
+
placeholder: '100.64.0.5',
|
|
165
|
+
validate: (value) => {
|
|
166
|
+
if (!value)
|
|
167
|
+
return 'IP address is required';
|
|
168
|
+
const ipv4Regex = /^(\d{1,3}\.){3}\d{1,3}$/;
|
|
169
|
+
if (!ipv4Regex.test(value))
|
|
170
|
+
return 'Invalid IPv4 address format';
|
|
171
|
+
return undefined;
|
|
172
|
+
},
|
|
173
|
+
});
|
|
174
|
+
if (isCancel(manualInput)) {
|
|
175
|
+
return null;
|
|
176
|
+
}
|
|
177
|
+
// Replace __manual__ with actual IP
|
|
178
|
+
const idx = selectedIPs.indexOf('__manual__');
|
|
179
|
+
selectedIPs[idx] = manualInput;
|
|
180
|
+
}
|
|
181
|
+
// Remove duplicates and return
|
|
182
|
+
const uniqueIPs = [...new Set(selectedIPs)];
|
|
183
|
+
return uniqueIPs.join(',');
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Prompt for single IP selection (simpler version)
|
|
187
|
+
*/
|
|
188
|
+
export async function selectSingleIP() {
|
|
189
|
+
const interfaces = getNetworkInterfaces();
|
|
190
|
+
const relevantInterfaces = interfaces.filter(iface => {
|
|
191
|
+
const name = iface.name.toLowerCase();
|
|
192
|
+
return !name.includes('docker') &&
|
|
193
|
+
!name.startsWith('br-') &&
|
|
194
|
+
!name.includes('veth') &&
|
|
195
|
+
!name.startsWith('virbr');
|
|
196
|
+
});
|
|
197
|
+
if (relevantInterfaces.length === 0) {
|
|
198
|
+
const manualInput = await text({
|
|
199
|
+
message: 'Enter host IP address:',
|
|
200
|
+
placeholder: '192.168.1.100',
|
|
201
|
+
validate: (value) => {
|
|
202
|
+
if (!value)
|
|
203
|
+
return 'IP address is required';
|
|
204
|
+
const ipv4Regex = /^(\d{1,3}\.){3}\d{1,3}$/;
|
|
205
|
+
if (!ipv4Regex.test(value))
|
|
206
|
+
return 'Invalid IPv4 address format';
|
|
207
|
+
return undefined;
|
|
208
|
+
},
|
|
209
|
+
});
|
|
210
|
+
if (isCancel(manualInput)) {
|
|
211
|
+
return null;
|
|
212
|
+
}
|
|
213
|
+
return manualInput;
|
|
214
|
+
}
|
|
215
|
+
const options = relevantInterfaces.map(iface => {
|
|
216
|
+
const type = detectInterfaceType(iface);
|
|
217
|
+
return {
|
|
218
|
+
value: iface.address,
|
|
219
|
+
label: `${iface.address}`,
|
|
220
|
+
hint: `${iface.name} (${type})`,
|
|
221
|
+
};
|
|
222
|
+
});
|
|
223
|
+
options.push({
|
|
224
|
+
value: '__manual__',
|
|
225
|
+
label: 'Enter manually...',
|
|
226
|
+
hint: 'Type an IP address',
|
|
227
|
+
});
|
|
228
|
+
const selected = await select({
|
|
229
|
+
message: 'Select host IP address:',
|
|
230
|
+
options,
|
|
231
|
+
});
|
|
232
|
+
if (isCancel(selected)) {
|
|
233
|
+
return null;
|
|
234
|
+
}
|
|
235
|
+
if (selected === '__manual__') {
|
|
236
|
+
const manualInput = await text({
|
|
237
|
+
message: 'Enter IP address:',
|
|
238
|
+
placeholder: '192.168.1.100',
|
|
239
|
+
validate: (value) => {
|
|
240
|
+
if (!value)
|
|
241
|
+
return 'IP address is required';
|
|
242
|
+
const ipv4Regex = /^(\d{1,3}\.){3}\d{1,3}$/;
|
|
243
|
+
if (!ipv4Regex.test(value))
|
|
244
|
+
return 'Invalid IPv4 address format';
|
|
245
|
+
return undefined;
|
|
246
|
+
},
|
|
247
|
+
});
|
|
248
|
+
if (isCancel(manualInput)) {
|
|
249
|
+
return null;
|
|
250
|
+
}
|
|
251
|
+
return manualInput;
|
|
252
|
+
}
|
|
253
|
+
return selected;
|
|
254
|
+
}
|
|
255
|
+
//# sourceMappingURL=ip-select.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ip-select.js","sourceRoot":"","sources":["../../../src/lib/prompts/ip-select.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Player selection prompt component
|
|
3
|
+
* Reusable prompt for selecting a player from online players or manual entry
|
|
4
|
+
*/
|
|
5
|
+
export interface PlayerSelectOptions {
|
|
6
|
+
message?: string;
|
|
7
|
+
containerName: string;
|
|
8
|
+
allowManualEntry?: boolean;
|
|
9
|
+
includeOffline?: boolean;
|
|
10
|
+
}
|
|
11
|
+
export interface SelectedPlayer {
|
|
12
|
+
name: string;
|
|
13
|
+
isOnline: boolean;
|
|
14
|
+
source: 'online' | 'manual';
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Prompt user to select a player
|
|
18
|
+
* Returns the selected player info or null if cancelled
|
|
19
|
+
*/
|
|
20
|
+
export declare function selectPlayer(options: PlayerSelectOptions): Promise<SelectedPlayer | null>;
|
|
21
|
+
/**
|
|
22
|
+
* Simple text prompt for player name
|
|
23
|
+
*/
|
|
24
|
+
export declare function promptPlayerName(message?: string): Promise<string | null>;
|
|
25
|
+
//# sourceMappingURL=player-select.d.ts.map
|