@minecraft-docker/shared 1.6.1 → 1.6.3

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 (164) hide show
  1. package/dist/application/ports/inbound/IWorldManagementUseCase.d.ts +41 -0
  2. package/dist/application/ports/inbound/IWorldManagementUseCase.d.ts.map +1 -1
  3. package/dist/application/ports/inbound/index.d.ts +1 -1
  4. package/dist/application/ports/inbound/index.d.ts.map +1 -1
  5. package/dist/application/ports/index.d.ts +2 -2
  6. package/dist/application/ports/index.d.ts.map +1 -1
  7. package/dist/application/ports/outbound/IModSourcePort.d.ts +71 -0
  8. package/dist/application/ports/outbound/IModSourcePort.d.ts.map +1 -0
  9. package/dist/application/ports/outbound/IModSourcePort.js +19 -0
  10. package/dist/application/ports/outbound/IModSourcePort.js.map +1 -0
  11. package/dist/application/ports/outbound/IPromptPort.d.ts +12 -0
  12. package/dist/application/ports/outbound/IPromptPort.d.ts.map +1 -1
  13. package/dist/application/ports/outbound/IServiceManagerPort.d.ts +115 -0
  14. package/dist/application/ports/outbound/IServiceManagerPort.d.ts.map +1 -0
  15. package/dist/application/ports/outbound/IServiceManagerPort.js +2 -0
  16. package/dist/application/ports/outbound/IServiceManagerPort.js.map +1 -0
  17. package/dist/application/ports/outbound/IShellPort.d.ts +10 -2
  18. package/dist/application/ports/outbound/IShellPort.d.ts.map +1 -1
  19. package/dist/application/ports/outbound/IUserRepository.d.ts +42 -0
  20. package/dist/application/ports/outbound/IUserRepository.d.ts.map +1 -0
  21. package/dist/application/ports/outbound/IUserRepository.js +2 -0
  22. package/dist/application/ports/outbound/IUserRepository.js.map +1 -0
  23. package/dist/application/ports/outbound/IWorldRepository.d.ts +19 -0
  24. package/dist/application/ports/outbound/IWorldRepository.d.ts.map +1 -1
  25. package/dist/application/ports/outbound/index.d.ts +4 -1
  26. package/dist/application/ports/outbound/index.d.ts.map +1 -1
  27. package/dist/application/use-cases/CreateServerUseCase.d.ts.map +1 -1
  28. package/dist/application/use-cases/CreateServerUseCase.js +2 -3
  29. package/dist/application/use-cases/CreateServerUseCase.js.map +1 -1
  30. package/dist/application/use-cases/DeleteServerUseCase.js +5 -5
  31. package/dist/application/use-cases/DeleteServerUseCase.js.map +1 -1
  32. package/dist/application/use-cases/WorldManagementUseCase.d.ts +18 -1
  33. package/dist/application/use-cases/WorldManagementUseCase.d.ts.map +1 -1
  34. package/dist/application/use-cases/WorldManagementUseCase.js +332 -0
  35. package/dist/application/use-cases/WorldManagementUseCase.js.map +1 -1
  36. package/dist/docker/index.d.ts +51 -1
  37. package/dist/docker/index.d.ts.map +1 -1
  38. package/dist/docker/index.js +194 -4
  39. package/dist/docker/index.js.map +1 -1
  40. package/dist/domain/entities/User.d.ts +77 -0
  41. package/dist/domain/entities/User.d.ts.map +1 -0
  42. package/dist/domain/entities/User.js +121 -0
  43. package/dist/domain/entities/User.js.map +1 -0
  44. package/dist/domain/entities/World.d.ts +7 -1
  45. package/dist/domain/entities/World.d.ts.map +1 -1
  46. package/dist/domain/entities/World.js +14 -1
  47. package/dist/domain/entities/World.js.map +1 -1
  48. package/dist/domain/entities/index.d.ts +1 -0
  49. package/dist/domain/entities/index.d.ts.map +1 -1
  50. package/dist/domain/entities/index.js +1 -0
  51. package/dist/domain/entities/index.js.map +1 -1
  52. package/dist/domain/index.d.ts +2 -2
  53. package/dist/domain/index.d.ts.map +1 -1
  54. package/dist/domain/index.js +4 -2
  55. package/dist/domain/index.js.map +1 -1
  56. package/dist/domain/mod/ModDependency.d.ts +18 -0
  57. package/dist/domain/mod/ModDependency.d.ts.map +1 -0
  58. package/dist/domain/mod/ModDependency.js +5 -0
  59. package/dist/domain/mod/ModDependency.js.map +1 -0
  60. package/dist/domain/mod/ModFile.d.ts +27 -0
  61. package/dist/domain/mod/ModFile.d.ts.map +1 -0
  62. package/dist/domain/mod/ModFile.js +5 -0
  63. package/dist/domain/mod/ModFile.js.map +1 -0
  64. package/dist/domain/mod/ModProject.d.ts +36 -0
  65. package/dist/domain/mod/ModProject.d.ts.map +1 -0
  66. package/dist/domain/mod/ModProject.js +5 -0
  67. package/dist/domain/mod/ModProject.js.map +1 -0
  68. package/dist/domain/mod/ModSearchResult.d.ts +18 -0
  69. package/dist/domain/mod/ModSearchResult.d.ts.map +1 -0
  70. package/dist/domain/mod/ModSearchResult.js +5 -0
  71. package/dist/domain/mod/ModSearchResult.js.map +1 -0
  72. package/dist/domain/mod/ModVersion.d.ts +36 -0
  73. package/dist/domain/mod/ModVersion.d.ts.map +1 -0
  74. package/dist/domain/mod/ModVersion.js +5 -0
  75. package/dist/domain/mod/ModVersion.js.map +1 -0
  76. package/dist/domain/mod/index.d.ts +11 -0
  77. package/dist/domain/mod/index.d.ts.map +1 -0
  78. package/dist/domain/mod/index.js +6 -0
  79. package/dist/domain/mod/index.js.map +1 -0
  80. package/dist/domain/mod/types.d.ts +43 -0
  81. package/dist/domain/mod/types.d.ts.map +1 -0
  82. package/dist/domain/mod/types.js +6 -0
  83. package/dist/domain/mod/types.js.map +1 -0
  84. package/dist/domain/value-objects/ProcessInfo.d.ts +99 -0
  85. package/dist/domain/value-objects/ProcessInfo.d.ts.map +1 -0
  86. package/dist/domain/value-objects/ProcessInfo.js +171 -0
  87. package/dist/domain/value-objects/ProcessInfo.js.map +1 -0
  88. package/dist/domain/value-objects/Role.d.ts +41 -0
  89. package/dist/domain/value-objects/Role.d.ts.map +1 -0
  90. package/dist/domain/value-objects/Role.js +66 -0
  91. package/dist/domain/value-objects/Role.js.map +1 -0
  92. package/dist/domain/value-objects/ServerType.d.ts +1 -0
  93. package/dist/domain/value-objects/ServerType.d.ts.map +1 -1
  94. package/dist/domain/value-objects/ServerType.js +8 -0
  95. package/dist/domain/value-objects/ServerType.js.map +1 -1
  96. package/dist/domain/value-objects/ServiceStatus.d.ts +64 -0
  97. package/dist/domain/value-objects/ServiceStatus.d.ts.map +1 -0
  98. package/dist/domain/value-objects/ServiceStatus.js +99 -0
  99. package/dist/domain/value-objects/ServiceStatus.js.map +1 -0
  100. package/dist/domain/value-objects/UserId.d.ts +21 -0
  101. package/dist/domain/value-objects/UserId.d.ts.map +1 -0
  102. package/dist/domain/value-objects/UserId.js +43 -0
  103. package/dist/domain/value-objects/UserId.js.map +1 -0
  104. package/dist/domain/value-objects/Username.d.ts +16 -0
  105. package/dist/domain/value-objects/Username.d.ts.map +1 -0
  106. package/dist/domain/value-objects/Username.js +46 -0
  107. package/dist/domain/value-objects/Username.js.map +1 -0
  108. package/dist/domain/value-objects/index.d.ts +5 -0
  109. package/dist/domain/value-objects/index.d.ts.map +1 -1
  110. package/dist/domain/value-objects/index.js +7 -0
  111. package/dist/domain/value-objects/index.js.map +1 -1
  112. package/dist/index.d.ts +4 -2
  113. package/dist/index.d.ts.map +1 -1
  114. package/dist/index.js +9 -3
  115. package/dist/index.js.map +1 -1
  116. package/dist/infrastructure/adapters/ApiPromptAdapter.d.ts +115 -0
  117. package/dist/infrastructure/adapters/ApiPromptAdapter.d.ts.map +1 -0
  118. package/dist/infrastructure/adapters/ApiPromptAdapter.js +268 -0
  119. package/dist/infrastructure/adapters/ApiPromptAdapter.js.map +1 -0
  120. package/dist/infrastructure/adapters/ServerRepository.js +3 -3
  121. package/dist/infrastructure/adapters/ServerRepository.js.map +1 -1
  122. package/dist/infrastructure/adapters/ShellAdapter.d.ts +4 -2
  123. package/dist/infrastructure/adapters/ShellAdapter.d.ts.map +1 -1
  124. package/dist/infrastructure/adapters/ShellAdapter.js +15 -5
  125. package/dist/infrastructure/adapters/ShellAdapter.js.map +1 -1
  126. package/dist/infrastructure/adapters/SqliteUserRepository.d.ts +70 -0
  127. package/dist/infrastructure/adapters/SqliteUserRepository.d.ts.map +1 -0
  128. package/dist/infrastructure/adapters/SqliteUserRepository.js +149 -0
  129. package/dist/infrastructure/adapters/SqliteUserRepository.js.map +1 -0
  130. package/dist/infrastructure/adapters/WorldRepository.d.ts +12 -0
  131. package/dist/infrastructure/adapters/WorldRepository.d.ts.map +1 -1
  132. package/dist/infrastructure/adapters/WorldRepository.js +73 -3
  133. package/dist/infrastructure/adapters/WorldRepository.js.map +1 -1
  134. package/dist/infrastructure/adapters/YamlUserRepository.d.ts +67 -0
  135. package/dist/infrastructure/adapters/YamlUserRepository.d.ts.map +1 -0
  136. package/dist/infrastructure/adapters/YamlUserRepository.js +161 -0
  137. package/dist/infrastructure/adapters/YamlUserRepository.js.map +1 -0
  138. package/dist/infrastructure/adapters/index.d.ts +3 -0
  139. package/dist/infrastructure/adapters/index.d.ts.map +1 -1
  140. package/dist/infrastructure/adapters/index.js +3 -0
  141. package/dist/infrastructure/adapters/index.js.map +1 -1
  142. package/dist/infrastructure/config/Pm2EcosystemConfig.d.ts +192 -0
  143. package/dist/infrastructure/config/Pm2EcosystemConfig.d.ts.map +1 -0
  144. package/dist/infrastructure/config/Pm2EcosystemConfig.js +48 -0
  145. package/dist/infrastructure/config/Pm2EcosystemConfig.js.map +1 -0
  146. package/dist/infrastructure/config/index.d.ts +6 -0
  147. package/dist/infrastructure/config/index.d.ts.map +1 -0
  148. package/dist/infrastructure/config/index.js +6 -0
  149. package/dist/infrastructure/config/index.js.map +1 -0
  150. package/dist/infrastructure/factories/ModSourceFactory.d.ts +73 -0
  151. package/dist/infrastructure/factories/ModSourceFactory.d.ts.map +1 -0
  152. package/dist/infrastructure/factories/ModSourceFactory.js +98 -0
  153. package/dist/infrastructure/factories/ModSourceFactory.js.map +1 -0
  154. package/dist/infrastructure/factories/index.d.ts +5 -0
  155. package/dist/infrastructure/factories/index.d.ts.map +1 -0
  156. package/dist/infrastructure/factories/index.js +5 -0
  157. package/dist/infrastructure/factories/index.js.map +1 -0
  158. package/dist/infrastructure/index.d.ts +1 -0
  159. package/dist/infrastructure/index.d.ts.map +1 -1
  160. package/dist/infrastructure/index.js +1 -0
  161. package/dist/infrastructure/index.js.map +1 -1
  162. package/dist/types/index.d.ts +1 -1
  163. package/dist/types/index.d.ts.map +1 -1
  164. package/package.json +10 -2
@@ -0,0 +1,149 @@
1
+ import Database from 'better-sqlite3';
2
+ import { mkdirSync, existsSync } from 'node:fs';
3
+ import { dirname } from 'node:path';
4
+ import * as bcrypt from 'bcryptjs';
5
+ import { User } from '../../domain/entities/User.js';
6
+ /**
7
+ * SqliteUserRepository
8
+ * Implements IUserRepository using SQLite database storage with better-sqlite3
9
+ */
10
+ export class SqliteUserRepository {
11
+ static SALT_ROUNDS = 10;
12
+ db;
13
+ /**
14
+ * Create a new SqliteUserRepository
15
+ * @param dbPath - Path to the SQLite database file
16
+ */
17
+ constructor(dbPath) {
18
+ // Ensure directory exists
19
+ const dir = dirname(dbPath);
20
+ if (!existsSync(dir)) {
21
+ mkdirSync(dir, { recursive: true });
22
+ }
23
+ // Open database connection
24
+ this.db = new Database(dbPath);
25
+ // Enable WAL mode for better concurrency
26
+ this.db.pragma('journal_mode = WAL');
27
+ // Run migrations
28
+ this.migrate();
29
+ }
30
+ /**
31
+ * Run database migrations
32
+ * Creates tables and indexes if they don't exist
33
+ */
34
+ migrate() {
35
+ this.db.exec(`
36
+ CREATE TABLE IF NOT EXISTS users (
37
+ id TEXT PRIMARY KEY,
38
+ username TEXT UNIQUE NOT NULL COLLATE NOCASE,
39
+ password_hash TEXT NOT NULL,
40
+ role TEXT NOT NULL CHECK(role IN ('admin', 'viewer')),
41
+ created_at TEXT DEFAULT CURRENT_TIMESTAMP,
42
+ updated_at TEXT DEFAULT CURRENT_TIMESTAMP
43
+ );
44
+
45
+ CREATE INDEX IF NOT EXISTS idx_users_username ON users(username);
46
+ CREATE INDEX IF NOT EXISTS idx_users_role ON users(role);
47
+ `);
48
+ }
49
+ /**
50
+ * Find a user by their unique ID
51
+ */
52
+ async findById(id) {
53
+ const stmt = this.db.prepare('SELECT * FROM users WHERE id = ?');
54
+ const row = stmt.get(id.value);
55
+ if (!row) {
56
+ return null;
57
+ }
58
+ return this.toUser(row);
59
+ }
60
+ /**
61
+ * Find a user by their username (case-insensitive)
62
+ */
63
+ async findByUsername(username) {
64
+ // SQLite COLLATE NOCASE handles case-insensitive comparison
65
+ const stmt = this.db.prepare('SELECT * FROM users WHERE username = ?');
66
+ const row = stmt.get(username.value);
67
+ if (!row) {
68
+ return null;
69
+ }
70
+ return this.toUser(row);
71
+ }
72
+ /**
73
+ * Get all users in the system
74
+ */
75
+ async findAll() {
76
+ const stmt = this.db.prepare('SELECT * FROM users ORDER BY created_at ASC');
77
+ const rows = stmt.all();
78
+ return rows.map((row) => this.toUser(row));
79
+ }
80
+ /**
81
+ * Save a user (create or update)
82
+ * Uses INSERT OR REPLACE for upsert behavior
83
+ */
84
+ async save(user) {
85
+ const stmt = this.db.prepare(`
86
+ INSERT INTO users (id, username, password_hash, role, created_at, updated_at)
87
+ VALUES (?, ?, ?, ?, ?, ?)
88
+ ON CONFLICT(id) DO UPDATE SET
89
+ username = excluded.username,
90
+ password_hash = excluded.password_hash,
91
+ role = excluded.role,
92
+ updated_at = excluded.updated_at
93
+ `);
94
+ stmt.run(user.id.value, user.username.value, user.passwordHash, user.role.value, user.createdAt.toISOString(), user.updatedAt.toISOString());
95
+ }
96
+ /**
97
+ * Delete a user by their ID
98
+ */
99
+ async delete(id) {
100
+ const stmt = this.db.prepare('DELETE FROM users WHERE id = ?');
101
+ stmt.run(id.value);
102
+ }
103
+ /**
104
+ * Get the total count of users
105
+ */
106
+ async count() {
107
+ const stmt = this.db.prepare('SELECT COUNT(*) as count FROM users');
108
+ const result = stmt.get();
109
+ return result?.count ?? 0;
110
+ }
111
+ /**
112
+ * Hash a password using bcrypt
113
+ * @param password - Plain text password to hash
114
+ * @returns Hashed password
115
+ */
116
+ async hashPassword(password) {
117
+ return bcrypt.hash(password, SqliteUserRepository.SALT_ROUNDS);
118
+ }
119
+ /**
120
+ * Verify a password against a hash
121
+ * @param password - Plain text password to verify
122
+ * @param hash - Password hash to verify against
123
+ * @returns True if password matches, false otherwise
124
+ */
125
+ async verifyPassword(password, hash) {
126
+ return bcrypt.compare(password, hash);
127
+ }
128
+ /**
129
+ * Close the database connection
130
+ * Should be called when the repository is no longer needed
131
+ */
132
+ close() {
133
+ this.db.close();
134
+ }
135
+ /**
136
+ * Convert a database row to a User entity
137
+ */
138
+ toUser(row) {
139
+ return User.fromRaw({
140
+ id: row.id,
141
+ username: row.username,
142
+ passwordHash: row.password_hash,
143
+ role: row.role,
144
+ createdAt: row.created_at,
145
+ updatedAt: row.updated_at,
146
+ });
147
+ }
148
+ }
149
+ //# sourceMappingURL=SqliteUserRepository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SqliteUserRepository.js","sourceRoot":"","sources":["../../../src/infrastructure/adapters/SqliteUserRepository.ts"],"names":[],"mappings":"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"}
@@ -47,9 +47,21 @@ export declare class WorldRepository implements IWorldRepository {
47
47
  * Returns worlds categorized by availability
48
48
  */
49
49
  findAllWithServerStatus(): Promise<WorldWithServerStatus[]>;
50
+ /**
51
+ * Delete a world directory and its lock file
52
+ */
53
+ delete(name: string): Promise<boolean>;
50
54
  /**
51
55
  * Get directory size recursively
52
56
  */
53
57
  private getDirectorySize;
58
+ /**
59
+ * Create a new world directory with optional seed
60
+ */
61
+ create(name: string, seed?: string): Promise<World>;
62
+ /**
63
+ * Get seed for a world from .meta file
64
+ */
65
+ getSeed(name: string): Promise<string | null>;
54
66
  }
55
67
  //# sourceMappingURL=WorldRepository.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"WorldRepository.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/adapters/WorldRepository.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAE9C,OAAO,KAAK,EACV,gBAAgB,EAChB,aAAa,EACb,qBAAqB,EAGtB,MAAM,sDAAsD,CAAC;AAE9D;;;GAGG;AACH,qBAAa,eAAgB,YAAW,gBAAgB;IACtD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAC9B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;gBAEtB,KAAK,CAAC,EAAE,KAAK;IAMzB;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;IAcjC;;OAEG;IACG,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IA2BrD;;OAEG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAK5C;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;IAKtC;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;IAKpC;;OAEG;IACG,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAKxD;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAgBpC;;OAEG;IACG,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IA0BhE;;;OAGG;IACG,uBAAuB,IAAI,OAAO,CAAC,qBAAqB,EAAE,CAAC;IA0DjE;;OAEG;YACW,gBAAgB;CAsB/B"}
1
+ {"version":3,"file":"WorldRepository.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/adapters/WorldRepository.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAE9C,OAAO,KAAK,EACV,gBAAgB,EAChB,aAAa,EACb,qBAAqB,EAGtB,MAAM,sDAAsD,CAAC;AAE9D;;;GAGG;AACH,qBAAa,eAAgB,YAAW,gBAAgB;IACtD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAC9B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;gBAEtB,KAAK,CAAC,EAAE,KAAK;IAMzB;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;IAcjC;;OAEG;IACG,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IA4BrD;;OAEG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAK5C;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;IAKtC;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;IAKpC;;OAEG;IACG,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAKxD;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAgBpC;;OAEG;IACG,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IA0BhE;;;OAGG;IACG,uBAAuB,IAAI,OAAO,CAAC,qBAAqB,EAAE,CAAC;IA0DjE;;OAEG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAsB5C;;OAEG;YACW,gBAAgB;IAuB9B;;OAEG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;IAkCzD;;OAEG;IACG,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CAepD"}
@@ -1,4 +1,4 @@
1
- import { readdir, readFile, stat } from 'node:fs/promises';
1
+ import { readdir, readFile, stat, rm, unlink, mkdir, writeFile } from 'node:fs/promises';
2
2
  import { join } from 'node:path';
3
3
  import { existsSync } from 'node:fs';
4
4
  import { Paths } from '../../utils/index.js';
@@ -45,11 +45,12 @@ export class WorldRepository {
45
45
  if (lockData) {
46
46
  world.lockTo(lockData.serverName, lockData.pid);
47
47
  }
48
- // Get world metadata
48
+ // Get world metadata and seed
49
49
  try {
50
50
  const worldStat = await stat(worldPath);
51
51
  const size = await this.getDirectorySize(worldPath);
52
- world.setMetadata(size, worldStat.mtime);
52
+ const seed = await this.getSeed(name);
53
+ world.setMetadata(size, worldStat.mtime, seed ?? undefined);
53
54
  }
54
55
  catch {
55
56
  // Ignore metadata errors
@@ -186,6 +187,28 @@ export class WorldRepository {
186
187
  return a.world.name.localeCompare(b.world.name);
187
188
  });
188
189
  }
190
+ /**
191
+ * Delete a world directory and its lock file
192
+ */
193
+ async delete(name) {
194
+ const worldPath = join(this.worldsDir, name);
195
+ const lockFile = join(this.locksDir, `${name}.lock`);
196
+ if (!existsSync(worldPath)) {
197
+ return false;
198
+ }
199
+ try {
200
+ // Delete lock file if exists
201
+ if (existsSync(lockFile)) {
202
+ await unlink(lockFile);
203
+ }
204
+ // Delete world directory
205
+ await rm(worldPath, { recursive: true, force: true });
206
+ return true;
207
+ }
208
+ catch {
209
+ return false;
210
+ }
211
+ }
189
212
  /**
190
213
  * Get directory size recursively
191
214
  */
@@ -209,5 +232,52 @@ export class WorldRepository {
209
232
  }
210
233
  return totalSize;
211
234
  }
235
+ /**
236
+ * Create a new world directory with optional seed
237
+ */
238
+ async create(name, seed) {
239
+ const worldPath = join(this.worldsDir, name);
240
+ // Check if already exists
241
+ if (existsSync(worldPath)) {
242
+ throw new Error(`World '${name}' already exists`);
243
+ }
244
+ // Ensure worlds directory exists
245
+ if (!existsSync(this.worldsDir)) {
246
+ await mkdir(this.worldsDir, { recursive: true });
247
+ }
248
+ // Create world directory
249
+ await mkdir(worldPath, { recursive: true });
250
+ // Create .meta file with seed if provided
251
+ const metaPath = join(worldPath, '.meta');
252
+ const metaContent = {
253
+ name,
254
+ seed: seed || null,
255
+ createdAt: new Date().toISOString(),
256
+ };
257
+ await writeFile(metaPath, JSON.stringify(metaContent, null, 2), 'utf-8');
258
+ // Create and return the World entity
259
+ const world = new World(name, worldPath);
260
+ if (seed) {
261
+ world.setSeed(seed);
262
+ }
263
+ return world;
264
+ }
265
+ /**
266
+ * Get seed for a world from .meta file
267
+ */
268
+ async getSeed(name) {
269
+ const metaPath = join(this.worldsDir, name, '.meta');
270
+ if (!existsSync(metaPath)) {
271
+ return null;
272
+ }
273
+ try {
274
+ const content = await readFile(metaPath, 'utf-8');
275
+ const meta = JSON.parse(content);
276
+ return meta.seed || null;
277
+ }
278
+ catch {
279
+ return null;
280
+ }
281
+ }
212
282
  }
213
283
  //# sourceMappingURL=WorldRepository.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"WorldRepository.js","sourceRoot":"","sources":["../../../src/infrastructure/adapters/WorldRepository.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"WorldRepository.js","sourceRoot":"","sources":["../../../src/infrastructure/adapters/WorldRepository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ import type { IUserRepository } from '../../application/ports/outbound/IUserRepository.js';
2
+ import { User } from '../../domain/entities/User.js';
3
+ import { UserId } from '../../domain/value-objects/UserId.js';
4
+ import { Username } from '../../domain/value-objects/Username.js';
5
+ /**
6
+ * YamlUserRepository
7
+ * Implements IUserRepository using YAML file storage
8
+ */
9
+ export declare class YamlUserRepository implements IUserRepository {
10
+ private static readonly SALT_ROUNDS;
11
+ private readonly filePath;
12
+ /**
13
+ * Create a new YamlUserRepository
14
+ * @param filePath - Path to the YAML file for user storage
15
+ */
16
+ constructor(filePath: string);
17
+ /**
18
+ * Find a user by their unique ID
19
+ */
20
+ findById(id: UserId): Promise<User | null>;
21
+ /**
22
+ * Find a user by their username
23
+ */
24
+ findByUsername(username: Username): Promise<User | null>;
25
+ /**
26
+ * Get all users in the system
27
+ */
28
+ findAll(): Promise<User[]>;
29
+ /**
30
+ * Save a user (create or update)
31
+ */
32
+ save(user: User): Promise<void>;
33
+ /**
34
+ * Delete a user by their ID
35
+ */
36
+ delete(id: UserId): Promise<void>;
37
+ /**
38
+ * Get the total count of users
39
+ */
40
+ count(): Promise<number>;
41
+ /**
42
+ * Hash a password using bcrypt
43
+ * @param password - Plain text password to hash
44
+ * @returns Hashed password
45
+ */
46
+ hashPassword(password: string): Promise<string>;
47
+ /**
48
+ * Verify a password against a hash
49
+ * @param password - Plain text password to verify
50
+ * @param hash - Password hash to verify against
51
+ * @returns True if password matches, false otherwise
52
+ */
53
+ verifyPassword(password: string, hash: string): Promise<boolean>;
54
+ /**
55
+ * Load users from YAML file
56
+ */
57
+ private loadUsers;
58
+ /**
59
+ * Save users to YAML file
60
+ */
61
+ private saveUsers;
62
+ /**
63
+ * Convert YAML user data to User entity
64
+ */
65
+ private toUser;
66
+ }
67
+ //# sourceMappingURL=YamlUserRepository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"YamlUserRepository.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/adapters/YamlUserRepository.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qDAAqD,CAAC;AAC3F,OAAO,EAAE,IAAI,EAAE,MAAM,+BAA+B,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,sCAAsC,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,wCAAwC,CAAC;AAkBlE;;;GAGG;AACH,qBAAa,kBAAmB,YAAW,eAAe;IACxD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAM;IACzC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAElC;;;OAGG;gBACS,QAAQ,EAAE,MAAM;IAI5B;;OAEG;IACG,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAWhD;;OAEG;IACG,cAAc,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAc9D;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;IAKhC;;OAEG;IACG,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBrC;;OAEG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASvC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IAK9B;;;;OAIG;IACG,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIrD;;;;;OAKG;IACG,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAItE;;OAEG;YACW,SAAS;IAoBvB;;OAEG;YACW,SAAS;IAkBvB;;OAEG;IACH,OAAO,CAAC,MAAM;CAUf"}
@@ -0,0 +1,161 @@
1
+ import { readFile, writeFile, mkdir } from 'node:fs/promises';
2
+ import { dirname } from 'node:path';
3
+ import { existsSync } from 'node:fs';
4
+ import * as yaml from 'js-yaml';
5
+ import * as bcrypt from 'bcryptjs';
6
+ import { User } from '../../domain/entities/User.js';
7
+ /**
8
+ * YamlUserRepository
9
+ * Implements IUserRepository using YAML file storage
10
+ */
11
+ export class YamlUserRepository {
12
+ static SALT_ROUNDS = 10;
13
+ filePath;
14
+ /**
15
+ * Create a new YamlUserRepository
16
+ * @param filePath - Path to the YAML file for user storage
17
+ */
18
+ constructor(filePath) {
19
+ this.filePath = filePath;
20
+ }
21
+ /**
22
+ * Find a user by their unique ID
23
+ */
24
+ async findById(id) {
25
+ const users = await this.loadUsers();
26
+ const userData = users.find((u) => u.id === id.value);
27
+ if (!userData) {
28
+ return null;
29
+ }
30
+ return this.toUser(userData);
31
+ }
32
+ /**
33
+ * Find a user by their username
34
+ */
35
+ async findByUsername(username) {
36
+ const users = await this.loadUsers();
37
+ // Case-insensitive username comparison
38
+ const userData = users.find((u) => u.username.toLowerCase() === username.value.toLowerCase());
39
+ if (!userData) {
40
+ return null;
41
+ }
42
+ return this.toUser(userData);
43
+ }
44
+ /**
45
+ * Get all users in the system
46
+ */
47
+ async findAll() {
48
+ const users = await this.loadUsers();
49
+ return users.map((u) => this.toUser(u));
50
+ }
51
+ /**
52
+ * Save a user (create or update)
53
+ */
54
+ async save(user) {
55
+ const users = await this.loadUsers();
56
+ const existingIndex = users.findIndex((u) => u.id === user.id.value);
57
+ const userData = {
58
+ id: user.id.value,
59
+ username: user.username.value,
60
+ passwordHash: user.passwordHash,
61
+ role: user.role.value,
62
+ createdAt: user.createdAt.toISOString(),
63
+ updatedAt: user.updatedAt.toISOString(),
64
+ };
65
+ if (existingIndex >= 0) {
66
+ // Update existing user
67
+ users[existingIndex] = userData;
68
+ }
69
+ else {
70
+ // Add new user
71
+ users.push(userData);
72
+ }
73
+ await this.saveUsers(users);
74
+ }
75
+ /**
76
+ * Delete a user by their ID
77
+ */
78
+ async delete(id) {
79
+ const users = await this.loadUsers();
80
+ const filteredUsers = users.filter((u) => u.id !== id.value);
81
+ if (filteredUsers.length !== users.length) {
82
+ await this.saveUsers(filteredUsers);
83
+ }
84
+ }
85
+ /**
86
+ * Get the total count of users
87
+ */
88
+ async count() {
89
+ const users = await this.loadUsers();
90
+ return users.length;
91
+ }
92
+ /**
93
+ * Hash a password using bcrypt
94
+ * @param password - Plain text password to hash
95
+ * @returns Hashed password
96
+ */
97
+ async hashPassword(password) {
98
+ return bcrypt.hash(password, YamlUserRepository.SALT_ROUNDS);
99
+ }
100
+ /**
101
+ * Verify a password against a hash
102
+ * @param password - Plain text password to verify
103
+ * @param hash - Password hash to verify against
104
+ * @returns True if password matches, false otherwise
105
+ */
106
+ async verifyPassword(password, hash) {
107
+ return bcrypt.compare(password, hash);
108
+ }
109
+ /**
110
+ * Load users from YAML file
111
+ */
112
+ async loadUsers() {
113
+ if (!existsSync(this.filePath)) {
114
+ return [];
115
+ }
116
+ try {
117
+ const content = await readFile(this.filePath, 'utf-8');
118
+ const data = yaml.load(content);
119
+ if (!data || !Array.isArray(data.users)) {
120
+ return [];
121
+ }
122
+ return data.users;
123
+ }
124
+ catch {
125
+ // If file is empty or invalid, return empty array
126
+ return [];
127
+ }
128
+ }
129
+ /**
130
+ * Save users to YAML file
131
+ */
132
+ async saveUsers(users) {
133
+ // Ensure directory exists
134
+ const dir = dirname(this.filePath);
135
+ if (!existsSync(dir)) {
136
+ await mkdir(dir, { recursive: true });
137
+ }
138
+ const data = { users };
139
+ const yamlContent = yaml.dump(data, {
140
+ indent: 2,
141
+ lineWidth: -1, // No line wrapping
142
+ quotingType: '"',
143
+ forceQuotes: false,
144
+ });
145
+ await writeFile(this.filePath, yamlContent, 'utf-8');
146
+ }
147
+ /**
148
+ * Convert YAML user data to User entity
149
+ */
150
+ toUser(data) {
151
+ return User.fromRaw({
152
+ id: data.id,
153
+ username: data.username,
154
+ passwordHash: data.passwordHash,
155
+ role: data.role,
156
+ createdAt: data.createdAt,
157
+ updatedAt: data.updatedAt,
158
+ });
159
+ }
160
+ }
161
+ //# sourceMappingURL=YamlUserRepository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"YamlUserRepository.js","sourceRoot":"","sources":["../../../src/infrastructure/adapters/YamlUserRepository.ts"],"names":[],"mappings":"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"}
@@ -6,4 +6,7 @@ export { ShellAdapter, type ShellAdapterOptions } from './ShellAdapter.js';
6
6
  export { ServerRepository } from './ServerRepository.js';
7
7
  export { WorldRepository } from './WorldRepository.js';
8
8
  export { DocsAdapter } from './DocsAdapter.js';
9
+ export { YamlUserRepository } from './YamlUserRepository.js';
10
+ export { SqliteUserRepository } from './SqliteUserRepository.js';
11
+ export { ApiPromptAdapter, ApiModeError, type ApiPromptOptions, type WorldSetupType, type MessageType, type CollectedMessage, } from './ApiPromptAdapter.js';
9
12
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/adapters/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,KAAK,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC3E,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/adapters/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,KAAK,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC3E,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,gBAAgB,GACtB,MAAM,uBAAuB,CAAC"}
@@ -6,4 +6,7 @@ export { ShellAdapter } from './ShellAdapter.js';
6
6
  export { ServerRepository } from './ServerRepository.js';
7
7
  export { WorldRepository } from './WorldRepository.js';
8
8
  export { DocsAdapter } from './DocsAdapter.js';
9
+ export { YamlUserRepository } from './YamlUserRepository.js';
10
+ export { SqliteUserRepository } from './SqliteUserRepository.js';
11
+ export { ApiPromptAdapter, ApiModeError, } from './ApiPromptAdapter.js';
9
12
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/infrastructure/adapters/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAA4B,MAAM,mBAAmB,CAAC;AAC3E,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/infrastructure/adapters/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAA4B,MAAM,mBAAmB,CAAC;AAC3E,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EACL,gBAAgB,EAChB,YAAY,GAKb,MAAM,uBAAuB,CAAC"}