@minecraft-docker/shared 1.5.0 → 1.6.1

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 (169) hide show
  1. package/dist/application/index.d.ts +3 -0
  2. package/dist/application/index.d.ts.map +1 -0
  3. package/dist/application/index.js +5 -0
  4. package/dist/application/index.js.map +1 -0
  5. package/dist/application/ports/inbound/IBackupUseCase.d.ts +69 -0
  6. package/dist/application/ports/inbound/IBackupUseCase.d.ts.map +1 -0
  7. package/dist/application/ports/inbound/IBackupUseCase.js +2 -0
  8. package/dist/application/ports/inbound/IBackupUseCase.js.map +1 -0
  9. package/dist/application/ports/inbound/ICreateServerUseCase.d.ts +32 -0
  10. package/dist/application/ports/inbound/ICreateServerUseCase.d.ts.map +1 -0
  11. package/dist/application/ports/inbound/ICreateServerUseCase.js +2 -0
  12. package/dist/application/ports/inbound/ICreateServerUseCase.js.map +1 -0
  13. package/dist/application/ports/inbound/IDeleteServerUseCase.d.ts +26 -0
  14. package/dist/application/ports/inbound/IDeleteServerUseCase.d.ts.map +1 -0
  15. package/dist/application/ports/inbound/IDeleteServerUseCase.js +2 -0
  16. package/dist/application/ports/inbound/IDeleteServerUseCase.js.map +1 -0
  17. package/dist/application/ports/inbound/IPlayerLookupUseCase.d.ts +47 -0
  18. package/dist/application/ports/inbound/IPlayerLookupUseCase.d.ts.map +1 -0
  19. package/dist/application/ports/inbound/IPlayerLookupUseCase.js +2 -0
  20. package/dist/application/ports/inbound/IPlayerLookupUseCase.js.map +1 -0
  21. package/dist/application/ports/inbound/IServerStatusUseCase.d.ts +34 -0
  22. package/dist/application/ports/inbound/IServerStatusUseCase.d.ts.map +1 -0
  23. package/dist/application/ports/inbound/IServerStatusUseCase.js +2 -0
  24. package/dist/application/ports/inbound/IServerStatusUseCase.js.map +1 -0
  25. package/dist/application/ports/inbound/IWorldManagementUseCase.d.ts +56 -0
  26. package/dist/application/ports/inbound/IWorldManagementUseCase.d.ts.map +1 -0
  27. package/dist/application/ports/inbound/IWorldManagementUseCase.js +2 -0
  28. package/dist/application/ports/inbound/IWorldManagementUseCase.js.map +1 -0
  29. package/dist/application/ports/inbound/index.d.ts +7 -0
  30. package/dist/application/ports/inbound/index.d.ts.map +1 -0
  31. package/dist/application/ports/inbound/index.js +2 -0
  32. package/dist/application/ports/inbound/index.js.map +1 -0
  33. package/dist/application/ports/index.d.ts +3 -0
  34. package/dist/application/ports/index.d.ts.map +1 -0
  35. package/dist/application/ports/index.js +2 -0
  36. package/dist/application/ports/index.js.map +1 -0
  37. package/dist/application/ports/outbound/IDocProvider.d.ts +73 -0
  38. package/dist/application/ports/outbound/IDocProvider.d.ts.map +1 -0
  39. package/dist/application/ports/outbound/IDocProvider.js +2 -0
  40. package/dist/application/ports/outbound/IDocProvider.js.map +1 -0
  41. package/dist/application/ports/outbound/IPromptPort.d.ts +136 -0
  42. package/dist/application/ports/outbound/IPromptPort.d.ts.map +1 -0
  43. package/dist/application/ports/outbound/IPromptPort.js +2 -0
  44. package/dist/application/ports/outbound/IPromptPort.js.map +1 -0
  45. package/dist/application/ports/outbound/IServerRepository.d.ts +54 -0
  46. package/dist/application/ports/outbound/IServerRepository.d.ts.map +1 -0
  47. package/dist/application/ports/outbound/IServerRepository.js +2 -0
  48. package/dist/application/ports/outbound/IServerRepository.js.map +1 -0
  49. package/dist/application/ports/outbound/IShellPort.d.ts +106 -0
  50. package/dist/application/ports/outbound/IShellPort.d.ts.map +1 -0
  51. package/dist/application/ports/outbound/IShellPort.js +2 -0
  52. package/dist/application/ports/outbound/IShellPort.js.map +1 -0
  53. package/dist/application/ports/outbound/IWorldRepository.d.ts +71 -0
  54. package/dist/application/ports/outbound/IWorldRepository.d.ts.map +1 -0
  55. package/dist/application/ports/outbound/IWorldRepository.js +2 -0
  56. package/dist/application/ports/outbound/IWorldRepository.js.map +1 -0
  57. package/dist/application/ports/outbound/index.d.ts +6 -0
  58. package/dist/application/ports/outbound/index.d.ts.map +1 -0
  59. package/dist/application/ports/outbound/index.js +2 -0
  60. package/dist/application/ports/outbound/index.js.map +1 -0
  61. package/dist/application/use-cases/BackupUseCase.d.ts +35 -0
  62. package/dist/application/use-cases/BackupUseCase.d.ts.map +1 -0
  63. package/dist/application/use-cases/BackupUseCase.js +222 -0
  64. package/dist/application/use-cases/BackupUseCase.js.map +1 -0
  65. package/dist/application/use-cases/CreateServerUseCase.d.ts +22 -0
  66. package/dist/application/use-cases/CreateServerUseCase.d.ts.map +1 -0
  67. package/dist/application/use-cases/CreateServerUseCase.js +145 -0
  68. package/dist/application/use-cases/CreateServerUseCase.js.map +1 -0
  69. package/dist/application/use-cases/DeleteServerUseCase.d.ts +24 -0
  70. package/dist/application/use-cases/DeleteServerUseCase.d.ts.map +1 -0
  71. package/dist/application/use-cases/DeleteServerUseCase.js +108 -0
  72. package/dist/application/use-cases/DeleteServerUseCase.js.map +1 -0
  73. package/dist/application/use-cases/PlayerLookupUseCase.d.ts +23 -0
  74. package/dist/application/use-cases/PlayerLookupUseCase.d.ts.map +1 -0
  75. package/dist/application/use-cases/PlayerLookupUseCase.js +130 -0
  76. package/dist/application/use-cases/PlayerLookupUseCase.js.map +1 -0
  77. package/dist/application/use-cases/ServerStatusUseCase.d.ts +30 -0
  78. package/dist/application/use-cases/ServerStatusUseCase.d.ts.map +1 -0
  79. package/dist/application/use-cases/ServerStatusUseCase.js +117 -0
  80. package/dist/application/use-cases/ServerStatusUseCase.js.map +1 -0
  81. package/dist/application/use-cases/WorldManagementUseCase.d.ts +33 -0
  82. package/dist/application/use-cases/WorldManagementUseCase.d.ts.map +1 -0
  83. package/dist/application/use-cases/WorldManagementUseCase.js +239 -0
  84. package/dist/application/use-cases/WorldManagementUseCase.js.map +1 -0
  85. package/dist/application/use-cases/index.d.ts +7 -0
  86. package/dist/application/use-cases/index.d.ts.map +1 -0
  87. package/dist/application/use-cases/index.js +7 -0
  88. package/dist/application/use-cases/index.js.map +1 -0
  89. package/dist/docker/index.d.ts +111 -0
  90. package/dist/docker/index.d.ts.map +1 -0
  91. package/dist/docker/index.js +532 -0
  92. package/dist/docker/index.js.map +1 -0
  93. package/dist/domain/entities/Server.d.ts +77 -0
  94. package/dist/domain/entities/Server.d.ts.map +1 -0
  95. package/dist/domain/entities/Server.js +138 -0
  96. package/dist/domain/entities/Server.js.map +1 -0
  97. package/dist/domain/entities/World.d.ts +70 -0
  98. package/dist/domain/entities/World.d.ts.map +1 -0
  99. package/dist/domain/entities/World.js +128 -0
  100. package/dist/domain/entities/World.js.map +1 -0
  101. package/dist/domain/entities/index.d.ts +3 -0
  102. package/dist/domain/entities/index.d.ts.map +1 -0
  103. package/dist/domain/entities/index.js +3 -0
  104. package/dist/domain/entities/index.js.map +1 -0
  105. package/dist/domain/index.d.ts +3 -0
  106. package/dist/domain/index.d.ts.map +1 -0
  107. package/dist/domain/index.js +5 -0
  108. package/dist/domain/index.js.map +1 -0
  109. package/dist/domain/value-objects/McVersion.d.ts +35 -0
  110. package/dist/domain/value-objects/McVersion.d.ts.map +1 -0
  111. package/dist/domain/value-objects/McVersion.js +117 -0
  112. package/dist/domain/value-objects/McVersion.js.map +1 -0
  113. package/dist/domain/value-objects/Memory.d.ts +37 -0
  114. package/dist/domain/value-objects/Memory.d.ts.map +1 -0
  115. package/dist/domain/value-objects/Memory.js +107 -0
  116. package/dist/domain/value-objects/Memory.js.map +1 -0
  117. package/dist/domain/value-objects/ServerName.d.ts +21 -0
  118. package/dist/domain/value-objects/ServerName.d.ts.map +1 -0
  119. package/dist/domain/value-objects/ServerName.js +58 -0
  120. package/dist/domain/value-objects/ServerName.js.map +1 -0
  121. package/dist/domain/value-objects/ServerType.d.ts +39 -0
  122. package/dist/domain/value-objects/ServerType.d.ts.map +1 -0
  123. package/dist/domain/value-objects/ServerType.js +128 -0
  124. package/dist/domain/value-objects/ServerType.js.map +1 -0
  125. package/dist/domain/value-objects/WorldOptions.d.ts +49 -0
  126. package/dist/domain/value-objects/WorldOptions.d.ts.map +1 -0
  127. package/dist/domain/value-objects/WorldOptions.js +149 -0
  128. package/dist/domain/value-objects/WorldOptions.js.map +1 -0
  129. package/dist/domain/value-objects/index.d.ts +6 -0
  130. package/dist/domain/value-objects/index.d.ts.map +1 -0
  131. package/dist/domain/value-objects/index.js +6 -0
  132. package/dist/domain/value-objects/index.js.map +1 -0
  133. package/dist/index.d.ts +7 -0
  134. package/dist/index.d.ts.map +1 -0
  135. package/dist/index.js +17 -0
  136. package/dist/index.js.map +1 -0
  137. package/dist/infrastructure/adapters/DocsAdapter.d.ts +45 -0
  138. package/dist/infrastructure/adapters/DocsAdapter.d.ts.map +1 -0
  139. package/dist/infrastructure/adapters/DocsAdapter.js +490 -0
  140. package/dist/infrastructure/adapters/DocsAdapter.js.map +1 -0
  141. package/dist/infrastructure/adapters/ServerRepository.d.ts +49 -0
  142. package/dist/infrastructure/adapters/ServerRepository.d.ts.map +1 -0
  143. package/dist/infrastructure/adapters/ServerRepository.js +206 -0
  144. package/dist/infrastructure/adapters/ServerRepository.js.map +1 -0
  145. package/dist/infrastructure/adapters/ShellAdapter.d.ts +39 -0
  146. package/dist/infrastructure/adapters/ShellAdapter.d.ts.map +1 -0
  147. package/dist/infrastructure/adapters/ShellAdapter.js +188 -0
  148. package/dist/infrastructure/adapters/ShellAdapter.js.map +1 -0
  149. package/dist/infrastructure/adapters/WorldRepository.d.ts +55 -0
  150. package/dist/infrastructure/adapters/WorldRepository.d.ts.map +1 -0
  151. package/dist/infrastructure/adapters/WorldRepository.js +213 -0
  152. package/dist/infrastructure/adapters/WorldRepository.js.map +1 -0
  153. package/dist/infrastructure/adapters/index.d.ts +9 -0
  154. package/dist/infrastructure/adapters/index.d.ts.map +1 -0
  155. package/dist/infrastructure/adapters/index.js +9 -0
  156. package/dist/infrastructure/adapters/index.js.map +1 -0
  157. package/dist/infrastructure/index.d.ts +6 -0
  158. package/dist/infrastructure/index.d.ts.map +1 -0
  159. package/dist/infrastructure/index.js +6 -0
  160. package/dist/infrastructure/index.js.map +1 -0
  161. package/dist/types/index.d.ts +151 -0
  162. package/dist/types/index.d.ts.map +1 -0
  163. package/dist/types/index.js +2 -0
  164. package/dist/types/index.js.map +1 -0
  165. package/dist/utils/index.d.ts +81 -0
  166. package/dist/utils/index.d.ts.map +1 -0
  167. package/dist/utils/index.js +200 -0
  168. package/dist/utils/index.js.map +1 -0
  169. package/package.json +1 -1
@@ -0,0 +1,145 @@
1
+ import { Server, ServerName, ServerType, McVersion, Memory, WorldOptions, WorldSetupType, } from '../../domain/index.js';
2
+ /**
3
+ * Create Server Use Case
4
+ * Orchestrates interactive server creation flow
5
+ */
6
+ export class CreateServerUseCase {
7
+ prompt;
8
+ shell;
9
+ serverRepo;
10
+ worldRepo;
11
+ constructor(prompt, shell, serverRepo, worldRepo) {
12
+ this.prompt = prompt;
13
+ this.shell = shell;
14
+ this.serverRepo = serverRepo;
15
+ this.worldRepo = worldRepo;
16
+ }
17
+ /**
18
+ * Execute interactive server creation
19
+ */
20
+ async execute() {
21
+ this.prompt.intro('Create Minecraft Server');
22
+ try {
23
+ // Prompt for server name
24
+ const name = await this.prompt.promptServerName();
25
+ // Check if server already exists
26
+ if (await this.serverRepo.exists(name.value)) {
27
+ this.prompt.error(`Server '${name.value}' already exists`);
28
+ this.prompt.handleCancel();
29
+ }
30
+ // Prompt for server type
31
+ const type = await this.prompt.promptServerType();
32
+ // Prompt for Minecraft version
33
+ const version = await this.prompt.promptMcVersion(type);
34
+ // Prompt for world options
35
+ let worldOptions = await this.prompt.promptWorldOptions();
36
+ // If "existing" was selected and we have a world repository,
37
+ // show the enhanced world selection with availability status
38
+ if (worldOptions.setupType === WorldSetupType.EXISTING &&
39
+ this.worldRepo) {
40
+ const worldsWithStatus = await this.worldRepo.findAllWithServerStatus();
41
+ const selectedWorld = await this.prompt.promptExistingWorldSelection(worldsWithStatus);
42
+ if (selectedWorld) {
43
+ worldOptions = WorldOptions.existingWorld(selectedWorld.name);
44
+ }
45
+ else {
46
+ // User cancelled or no world available, fallback to new world
47
+ this.prompt.info('Creating a new world instead');
48
+ worldOptions = WorldOptions.newWorld();
49
+ }
50
+ }
51
+ // Prompt for memory
52
+ const memory = await this.prompt.promptMemory();
53
+ // Create server configuration
54
+ const server = Server.create({
55
+ name,
56
+ type,
57
+ version,
58
+ memory,
59
+ worldOptions,
60
+ });
61
+ // Execute creation
62
+ const spinner = this.prompt.spinner();
63
+ spinner.start('Creating server...');
64
+ const result = await this.shell.createServer(name, {
65
+ type,
66
+ version,
67
+ worldOptions,
68
+ memory,
69
+ autoStart: true,
70
+ });
71
+ if (!result.success) {
72
+ spinner.stop('Failed to create server');
73
+ this.prompt.error(result.stderr || 'Unknown error occurred');
74
+ throw new Error(result.stderr || 'Server creation failed');
75
+ }
76
+ spinner.stop('Server created successfully');
77
+ this.prompt.success(`Server '${name.value}' created!`);
78
+ this.prompt.note(`Connect via: ${name.hostname}:25565`, 'Connection Info');
79
+ this.prompt.outro('Happy mining!');
80
+ return server;
81
+ }
82
+ catch (error) {
83
+ if (this.prompt.isCancel(error)) {
84
+ this.prompt.outro('Server creation cancelled');
85
+ throw error;
86
+ }
87
+ throw error;
88
+ }
89
+ }
90
+ /**
91
+ * Execute server creation with provided configuration
92
+ */
93
+ async executeWithConfig(config) {
94
+ // Parse configuration
95
+ const name = ServerName.create(config.name);
96
+ const type = config.type
97
+ ? ServerType.create(config.type)
98
+ : ServerType.getRecommended();
99
+ const version = config.version
100
+ ? McVersion.create(config.version)
101
+ : McVersion.latest();
102
+ const memory = config.memory
103
+ ? Memory.create(config.memory)
104
+ : Memory.default();
105
+ // Determine world options
106
+ let worldOptions;
107
+ if (config.worldUrl) {
108
+ worldOptions = WorldOptions.downloadWorld(config.worldUrl);
109
+ }
110
+ else if (config.worldName) {
111
+ worldOptions = WorldOptions.existingWorld(config.worldName);
112
+ }
113
+ else if (config.seed) {
114
+ worldOptions = WorldOptions.newWorld(config.seed);
115
+ }
116
+ else {
117
+ worldOptions = WorldOptions.default();
118
+ }
119
+ // Check if server already exists
120
+ if (await this.serverRepo.exists(name.value)) {
121
+ throw new Error(`Server '${name.value}' already exists`);
122
+ }
123
+ // Create server
124
+ const server = Server.create({
125
+ name,
126
+ type,
127
+ version,
128
+ memory,
129
+ worldOptions,
130
+ });
131
+ // Execute creation
132
+ const result = await this.shell.createServer(name, {
133
+ type,
134
+ version,
135
+ worldOptions,
136
+ memory,
137
+ autoStart: config.autoStart ?? true,
138
+ });
139
+ if (!result.success) {
140
+ throw new Error(result.stderr || 'Server creation failed');
141
+ }
142
+ return server;
143
+ }
144
+ }
145
+ //# sourceMappingURL=CreateServerUseCase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CreateServerUseCase.js","sourceRoot":"","sources":["../../../src/application/use-cases/CreateServerUseCase.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { IDeleteServerUseCase, IPromptPort, IShellPort, IServerRepository } from '../ports/index.js';
2
+ /**
3
+ * Delete Server Use Case
4
+ * Orchestrates server deletion with confirmation
5
+ */
6
+ export declare class DeleteServerUseCase implements IDeleteServerUseCase {
7
+ private readonly prompt;
8
+ private readonly shell;
9
+ private readonly serverRepo;
10
+ constructor(prompt: IPromptPort, shell: IShellPort, serverRepo: IServerRepository);
11
+ /**
12
+ * Execute interactive server deletion
13
+ */
14
+ execute(): Promise<boolean>;
15
+ /**
16
+ * Execute server deletion with provided name
17
+ */
18
+ executeWithName(name: string, force?: boolean): Promise<boolean>;
19
+ /**
20
+ * Perform the actual deletion
21
+ */
22
+ private performDeletion;
23
+ }
24
+ //# sourceMappingURL=DeleteServerUseCase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeleteServerUseCase.d.ts","sourceRoot":"","sources":["../../../src/application/use-cases/DeleteServerUseCase.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,oBAAoB,EACpB,WAAW,EACX,UAAU,EACV,iBAAiB,EAClB,MAAM,mBAAmB,CAAC;AAE3B;;;GAGG;AACH,qBAAa,mBAAoB,YAAW,oBAAoB;IAE5D,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,UAAU;gBAFV,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,UAAU,EACjB,UAAU,EAAE,iBAAiB;IAGhD;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;IAsDjC;;OAEG;IACG,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,UAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;IAkBpE;;OAEG;YACW,eAAe;CAwC9B"}
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Delete Server Use Case
3
+ * Orchestrates server deletion with confirmation
4
+ */
5
+ export class DeleteServerUseCase {
6
+ prompt;
7
+ shell;
8
+ serverRepo;
9
+ constructor(prompt, shell, serverRepo) {
10
+ this.prompt = prompt;
11
+ this.shell = shell;
12
+ this.serverRepo = serverRepo;
13
+ }
14
+ /**
15
+ * Execute interactive server deletion
16
+ */
17
+ async execute() {
18
+ this.prompt.intro('Delete Minecraft Server');
19
+ try {
20
+ // Get all servers
21
+ const servers = await this.serverRepo.findAll();
22
+ if (servers.length === 0) {
23
+ this.prompt.warn('No servers found');
24
+ this.prompt.outro('Nothing to delete');
25
+ return false;
26
+ }
27
+ // Prompt for server selection
28
+ const server = await this.prompt.promptServerSelection(servers);
29
+ // Show server info
30
+ this.prompt.note(`Name: ${server.name.value}\n` +
31
+ `Type: ${server.type.label} ${server.version.value}\n` +
32
+ `Status: ${server.status}\n` +
33
+ (server.hasPlayers ? `Players: ${server.playerCount} online` : ''), 'Server Info');
34
+ // Warn if running with players
35
+ if (server.isRunning && server.hasPlayers) {
36
+ this.prompt.warn(`Warning: ${server.playerCount} player(s) are currently online!`);
37
+ }
38
+ // Confirm deletion
39
+ const confirmed = await this.prompt.confirm({
40
+ message: 'Are you sure you want to delete this server?',
41
+ initialValue: false,
42
+ });
43
+ if (!confirmed) {
44
+ this.prompt.outro('Deletion cancelled');
45
+ return false;
46
+ }
47
+ // Execute deletion
48
+ return await this.performDeletion(server);
49
+ }
50
+ catch (error) {
51
+ if (this.prompt.isCancel(error)) {
52
+ this.prompt.outro('Deletion cancelled');
53
+ return false;
54
+ }
55
+ throw error;
56
+ }
57
+ }
58
+ /**
59
+ * Execute server deletion with provided name
60
+ */
61
+ async executeWithName(name, force = false) {
62
+ // Check if server exists
63
+ const server = await this.serverRepo.findByName(name);
64
+ if (!server) {
65
+ throw new Error(`Server '${name}' not found`);
66
+ }
67
+ // If not force mode and server has players, throw error
68
+ if (!force && server.isRunning && server.hasPlayers) {
69
+ throw new Error(`Server '${name}' has ${server.playerCount} player(s) online. Use --force to delete anyway.`);
70
+ }
71
+ return await this.performDeletion(server, force);
72
+ }
73
+ /**
74
+ * Perform the actual deletion
75
+ */
76
+ async performDeletion(server, force = false) {
77
+ const spinner = this.prompt.spinner();
78
+ try {
79
+ // Stop server if running
80
+ if (server.isRunning) {
81
+ spinner.start('Stopping server...');
82
+ await this.shell.stopServer(server.name);
83
+ spinner.message('Server stopped');
84
+ }
85
+ // Delete server
86
+ spinner.start('Removing server...');
87
+ const result = await this.shell.deleteServer(server.name, force);
88
+ if (!result.success) {
89
+ spinner.stop('Failed to delete server');
90
+ this.prompt.error(result.stderr || 'Unknown error occurred');
91
+ return false;
92
+ }
93
+ spinner.stop('Server deleted');
94
+ this.prompt.success(`Server '${server.name.value}' deleted`);
95
+ // Note about world preservation
96
+ if (server.worldOptions.isExistingWorld) {
97
+ this.prompt.note(`World data preserved in worlds/${server.worldOptions.worldName}/`, 'World Data');
98
+ }
99
+ this.prompt.outro('Server removed successfully');
100
+ return true;
101
+ }
102
+ catch (error) {
103
+ spinner.stop('Deletion failed');
104
+ throw error;
105
+ }
106
+ }
107
+ }
108
+ //# sourceMappingURL=DeleteServerUseCase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeleteServerUseCase.js","sourceRoot":"","sources":["../../../src/application/use-cases/DeleteServerUseCase.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { IPlayerLookupUseCase, PlayerLookupResult, PlayerUuidResult, IPromptPort, IShellPort } from '../ports/index.js';
2
+ /**
3
+ * Player Lookup Use Case
4
+ * Looks up Minecraft player information
5
+ */
6
+ export declare class PlayerLookupUseCase implements IPlayerLookupUseCase {
7
+ private readonly prompt;
8
+ private readonly shell;
9
+ constructor(prompt: IPromptPort, shell: IShellPort);
10
+ /**
11
+ * Interactive player lookup
12
+ */
13
+ lookup(): Promise<PlayerLookupResult>;
14
+ /**
15
+ * Lookup player by name
16
+ */
17
+ lookupByName(name: string): Promise<PlayerLookupResult>;
18
+ /**
19
+ * Get player UUID
20
+ */
21
+ getUuid(name: string, offline?: boolean): Promise<PlayerUuidResult>;
22
+ }
23
+ //# sourceMappingURL=PlayerLookupUseCase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PlayerLookupUseCase.d.ts","sourceRoot":"","sources":["../../../src/application/use-cases/PlayerLookupUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,WAAW,EACX,UAAU,EACX,MAAM,mBAAmB,CAAC;AAE3B;;;GAGG;AACH,qBAAa,mBAAoB,YAAW,oBAAoB;IAE5D,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK;gBADL,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,UAAU;IAGpC;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAyC3C;;OAEG;IACG,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAwD7D;;OAEG;IACG,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,UAAQ,GAAG,OAAO,CAAC,gBAAgB,CAAC;CAgCxE"}
@@ -0,0 +1,130 @@
1
+ /**
2
+ * Player Lookup Use Case
3
+ * Looks up Minecraft player information
4
+ */
5
+ export class PlayerLookupUseCase {
6
+ prompt;
7
+ shell;
8
+ constructor(prompt, shell) {
9
+ this.prompt = prompt;
10
+ this.shell = shell;
11
+ }
12
+ /**
13
+ * Interactive player lookup
14
+ */
15
+ async lookup() {
16
+ this.prompt.intro('Player Lookup');
17
+ try {
18
+ // Prompt for player name
19
+ const name = await this.prompt.text({
20
+ message: 'Player name:',
21
+ placeholder: 'Notch',
22
+ validate: (value) => {
23
+ if (!value.trim()) {
24
+ return 'Player name is required';
25
+ }
26
+ if (!/^[a-zA-Z0-9_]{3,16}$/.test(value.trim())) {
27
+ return 'Invalid player name (3-16 alphanumeric characters)';
28
+ }
29
+ return undefined;
30
+ },
31
+ });
32
+ if (this.prompt.isCancel(name)) {
33
+ this.prompt.outro('Lookup cancelled');
34
+ return {
35
+ success: false,
36
+ error: 'Cancelled',
37
+ };
38
+ }
39
+ // Execute lookup
40
+ return await this.lookupByName(name);
41
+ }
42
+ catch (error) {
43
+ if (this.prompt.isCancel(error)) {
44
+ this.prompt.outro('Lookup cancelled');
45
+ return {
46
+ success: false,
47
+ error: 'Cancelled',
48
+ };
49
+ }
50
+ throw error;
51
+ }
52
+ }
53
+ /**
54
+ * Lookup player by name
55
+ */
56
+ async lookupByName(name) {
57
+ const spinner = this.prompt.spinner();
58
+ spinner.start('Looking up player...');
59
+ const result = await this.shell.playerLookup(name);
60
+ if (!result.success) {
61
+ spinner.stop('Lookup failed');
62
+ // Check if player not found
63
+ if (result.stderr?.includes('not found') || result.code === 1) {
64
+ this.prompt.warn(`Player '${name}' not found`);
65
+ this.prompt.outro('Player does not exist');
66
+ return {
67
+ success: false,
68
+ name,
69
+ error: 'Player not found',
70
+ };
71
+ }
72
+ this.prompt.error(result.stderr || 'Unknown error');
73
+ return {
74
+ success: false,
75
+ name,
76
+ error: result.stderr,
77
+ };
78
+ }
79
+ spinner.stop('Player found');
80
+ // Parse output
81
+ const output = result.stdout;
82
+ const uuidMatch = output.match(/UUID:\s*([a-f0-9-]+)/i);
83
+ const skinMatch = output.match(/Skin:\s*(.+)/i);
84
+ const uuid = uuidMatch ? uuidMatch[1] : undefined;
85
+ const skinUrl = skinMatch ? skinMatch[1]?.trim() : undefined;
86
+ // Display result
87
+ this.prompt.note(`Name: ${name}\n` +
88
+ (uuid ? `UUID: ${uuid}\n` : '') +
89
+ (skinUrl ? `Skin: ${skinUrl}` : ''), 'Player Info');
90
+ this.prompt.outro('Lookup complete');
91
+ return {
92
+ success: true,
93
+ name,
94
+ uuid,
95
+ skinUrl,
96
+ };
97
+ }
98
+ /**
99
+ * Get player UUID
100
+ */
101
+ async getUuid(name, offline = false) {
102
+ const result = await this.shell.playerUuid(name, offline);
103
+ if (!result.success) {
104
+ return {
105
+ success: false,
106
+ name,
107
+ isOffline: offline,
108
+ error: result.stderr || 'Failed to get UUID',
109
+ };
110
+ }
111
+ // Parse UUID from output
112
+ const uuidMatch = result.stdout.match(/([a-f0-9-]{36})/i);
113
+ const uuid = uuidMatch ? uuidMatch[1] : undefined;
114
+ if (!uuid) {
115
+ return {
116
+ success: false,
117
+ name,
118
+ isOffline: offline,
119
+ error: 'Could not parse UUID from response',
120
+ };
121
+ }
122
+ return {
123
+ success: true,
124
+ name,
125
+ uuid,
126
+ isOffline: offline,
127
+ };
128
+ }
129
+ }
130
+ //# sourceMappingURL=PlayerLookupUseCase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PlayerLookupUseCase.js","sourceRoot":"","sources":["../../../src/application/use-cases/PlayerLookupUseCase.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { IServerStatusUseCase, ServerStatusResult, IPromptPort, IShellPort, IServerRepository } from '../ports/index.js';
2
+ /**
3
+ * Server Status Use Case
4
+ * Displays server status information
5
+ */
6
+ export declare class ServerStatusUseCase implements IServerStatusUseCase {
7
+ private readonly prompt;
8
+ private readonly shell;
9
+ private readonly serverRepo;
10
+ constructor(prompt: IPromptPort, shell: IShellPort, serverRepo: IServerRepository);
11
+ /**
12
+ * Get status of all servers
13
+ */
14
+ execute(): Promise<ServerStatusResult[]>;
15
+ /**
16
+ * Get status of a specific server
17
+ */
18
+ executeForServer(name: string): Promise<ServerStatusResult>;
19
+ /**
20
+ * Get status in JSON format
21
+ */
22
+ executeAsJson(): Promise<string>;
23
+ /**
24
+ * Display status with formatting
25
+ */
26
+ displayStatus(): Promise<void>;
27
+ private getStatusIcon;
28
+ private getStatusColor;
29
+ }
30
+ //# sourceMappingURL=ServerStatusUseCase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ServerStatusUseCase.d.ts","sourceRoot":"","sources":["../../../src/application/use-cases/ServerStatusUseCase.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,oBAAoB,EACpB,kBAAkB,EAClB,WAAW,EACX,UAAU,EACV,iBAAiB,EAClB,MAAM,mBAAmB,CAAC;AAE3B;;;GAGG;AACH,qBAAa,mBAAoB,YAAW,oBAAoB;IAE5D,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,UAAU;gBAFV,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,UAAU,EACjB,UAAU,EAAE,iBAAiB;IAGhD;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAe9C;;OAEG;IACG,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAmBjE;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC;IAUtC;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAiCpC,OAAO,CAAC,aAAa;IAiBrB,OAAO,CAAC,cAAc;CAevB"}
@@ -0,0 +1,117 @@
1
+ import { ServerStatus } from '../../domain/index.js';
2
+ /**
3
+ * Server Status Use Case
4
+ * Displays server status information
5
+ */
6
+ export class ServerStatusUseCase {
7
+ prompt;
8
+ shell;
9
+ serverRepo;
10
+ constructor(prompt, shell, serverRepo) {
11
+ this.prompt = prompt;
12
+ this.shell = shell;
13
+ this.serverRepo = serverRepo;
14
+ }
15
+ /**
16
+ * Get status of all servers
17
+ */
18
+ async execute() {
19
+ const servers = await this.serverRepo.findAll();
20
+ return servers.map((server) => ({
21
+ name: server.name.value,
22
+ containerName: server.containerName,
23
+ hostname: server.hostname,
24
+ status: server.status,
25
+ type: server.type.label,
26
+ version: server.version.value,
27
+ playerCount: server.playerCount,
28
+ memory: server.memory.value,
29
+ }));
30
+ }
31
+ /**
32
+ * Get status of a specific server
33
+ */
34
+ async executeForServer(name) {
35
+ const server = await this.serverRepo.findByName(name);
36
+ if (!server) {
37
+ throw new Error(`Server '${name}' not found`);
38
+ }
39
+ return {
40
+ name: server.name.value,
41
+ containerName: server.containerName,
42
+ hostname: server.hostname,
43
+ status: server.status,
44
+ type: server.type.label,
45
+ version: server.version.value,
46
+ playerCount: server.playerCount,
47
+ memory: server.memory.value,
48
+ };
49
+ }
50
+ /**
51
+ * Get status in JSON format
52
+ */
53
+ async executeAsJson() {
54
+ const result = await this.shell.status(true);
55
+ if (!result.success) {
56
+ throw new Error(result.stderr || 'Failed to get status');
57
+ }
58
+ return result.stdout;
59
+ }
60
+ /**
61
+ * Display status with formatting
62
+ */
63
+ async displayStatus() {
64
+ const servers = await this.execute();
65
+ if (servers.length === 0) {
66
+ this.prompt.warn('No servers found');
67
+ return;
68
+ }
69
+ // Display header
70
+ console.log('\n');
71
+ console.log('┌─────────────────────────────────────────────────────────────┐');
72
+ console.log('│ Server Status │');
73
+ console.log('├─────────────────────────────────────────────────────────────┤');
74
+ for (const server of servers) {
75
+ const statusIcon = this.getStatusIcon(server.status);
76
+ const statusColor = this.getStatusColor(server.status);
77
+ console.log(`│ ${statusIcon} ${server.name.padEnd(20)} ${server.type.padEnd(10)} ${server.version.padEnd(10)} │`);
78
+ if (server.status === ServerStatus.RUNNING) {
79
+ console.log(`│ └─ Players: ${server.playerCount} Memory: ${server.memory || 'N/A'}`.padEnd(64) + '│');
80
+ }
81
+ }
82
+ console.log('└─────────────────────────────────────────────────────────────┘');
83
+ console.log('\n');
84
+ }
85
+ getStatusIcon(status) {
86
+ switch (status) {
87
+ case ServerStatus.RUNNING:
88
+ return '🟢';
89
+ case ServerStatus.STOPPED:
90
+ return '🔴';
91
+ case ServerStatus.STARTING:
92
+ return '🟡';
93
+ case ServerStatus.STOPPING:
94
+ return '🟠';
95
+ case ServerStatus.ERROR:
96
+ return '❌';
97
+ default:
98
+ return '⚪';
99
+ }
100
+ }
101
+ getStatusColor(status) {
102
+ switch (status) {
103
+ case ServerStatus.RUNNING:
104
+ return 'green';
105
+ case ServerStatus.STOPPED:
106
+ return 'red';
107
+ case ServerStatus.STARTING:
108
+ case ServerStatus.STOPPING:
109
+ return 'yellow';
110
+ case ServerStatus.ERROR:
111
+ return 'red';
112
+ default:
113
+ return 'gray';
114
+ }
115
+ }
116
+ }
117
+ //# sourceMappingURL=ServerStatusUseCase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ServerStatusUseCase.js","sourceRoot":"","sources":["../../../src/application/use-cases/ServerStatusUseCase.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import type { IWorldManagementUseCase, WorldListResult, WorldAssignResult, WorldReleaseResult, IPromptPort, IShellPort, IWorldRepository, IServerRepository } from '../ports/index.js';
2
+ /**
3
+ * World Management Use Case
4
+ * Manages world assignments and locks
5
+ */
6
+ export declare class WorldManagementUseCase implements IWorldManagementUseCase {
7
+ private readonly prompt;
8
+ private readonly shell;
9
+ private readonly worldRepo;
10
+ private readonly serverRepo;
11
+ constructor(prompt: IPromptPort, shell: IShellPort, worldRepo: IWorldRepository, serverRepo: IServerRepository);
12
+ /**
13
+ * List all worlds with lock status
14
+ */
15
+ listWorlds(): Promise<WorldListResult[]>;
16
+ /**
17
+ * Interactive world assignment
18
+ */
19
+ assignWorld(): Promise<WorldAssignResult>;
20
+ /**
21
+ * Assign world to server by name
22
+ */
23
+ assignWorldByName(worldName: string, serverName: string): Promise<WorldAssignResult>;
24
+ /**
25
+ * Interactive world release
26
+ */
27
+ releaseWorld(): Promise<WorldReleaseResult>;
28
+ /**
29
+ * Release world by name
30
+ */
31
+ releaseWorldByName(worldName: string, force?: boolean): Promise<WorldReleaseResult>;
32
+ }
33
+ //# sourceMappingURL=WorldManagementUseCase.d.ts.map