@pompidup/kingdomino-engine 2.2.1 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -7,10 +7,42 @@
7
7
  ![Statements](./badges/coverage-statements.svg)
8
8
  ![Coverage total](./badges/coverage-total.svg)
9
9
 
10
+ A simple, lightweight TypeScript engine for the Kingdomino board game.
11
+
12
+ ## Table of Contents
13
+
14
+ - [Overview](#overview)
15
+ - [Requirements](#requirements)
16
+ - [Features](#features)
17
+ - [Installation](#installation)
18
+ - [Usage](#usage)
19
+ - [Basic Setup](#basic-setup)
20
+ - [Options for GameEngine](#options-for-gameengine)
21
+ - [Adding Players](#adding-players)
22
+ - [Getting Available Game Modes](#getting-available-game-modes)
23
+ - [Getting Available Extra Rules](#getting-available-extra-rules)
24
+ - [Setting Up Extra Rules](#setting-up-extra-rules)
25
+ - [Starting the Game](#starting-the-game)
26
+ - [Player Actions](#player-actions)
27
+ - [Game Flow](#game-flow)
28
+ - [Scoring](#scoring)
29
+ - [Complete Game Example](#complete-game-example)
30
+ - [Extra Rules](#extra-rules)
31
+ - [API Documentation](#api-documentation)
32
+ - [Key Types and Interfaces](#key-types-and-interfaces)
33
+ - [Methods](#methods)
34
+ - [Development](#development)
35
+ - [Setup](#setup)
36
+ - [Testing](#testing)
37
+ - [Building](#building)
38
+ - [Contributing](#contributing)
39
+
10
40
  ## Overview
11
41
 
12
42
  This is a simple and lightweight TypeScript engine designed to facilitate the gameplay of Kingdomino. It provides the core logic for managing game states, rules, and player interactions, making it easy to integrate into any application that requires a Kingdomino game engine.
13
43
 
44
+ Kingdomino is a tile-placement game where players build kingdoms by connecting domino-like tiles with different terrains. This engine handles all the game logic, allowing you to focus on building the user interface and experience.
45
+
14
46
  ## Requirements
15
47
 
16
48
  - Node v20.6.0 or higher
@@ -22,6 +54,8 @@ This is a simple and lightweight TypeScript engine designed to facilitate the ga
22
54
  - **Player Interaction**: Simplify player interactions, including drawing tiles, placing dominoes, and scoring.
23
55
  - **Extra Rules Support**: Implement and manage additional game rules for enhanced gameplay.
24
56
  - **Multiple Game Modes**: Support for different game modes, including Classic and potentially others.
57
+ - **Scoring System**: Automatic calculation of scores based on kingdom layouts and rule sets.
58
+ - **Typescript Support**: Full TypeScript support with comprehensive type definitions.
25
59
 
26
60
  ## Installation
27
61
 
@@ -141,7 +175,6 @@ gameState = engine.placeDomino({
141
175
  game: gameState,
142
176
  lordId: "lordId",
143
177
  position: { x: 0, y: 0 },
144
- orientation: "horizontal",
145
178
  rotation: 0,
146
179
  });
147
180
  ```
@@ -186,6 +219,68 @@ You have the possibility to get the results at any time of a kingdom, you can us
186
219
  const score = engine.calculateScore({ kingdom: gameState.players[0].kingdom });
187
220
  ```
188
221
 
222
+ ## Complete Game Example
223
+
224
+ Here's a complete example of how to simulate a game from start to finish:
225
+
226
+ ```typescript
227
+ import { createGameEngine, isGameWithNextAction } from "@pompidup/kingdomino-engine";
228
+
229
+ // Create the game engine
230
+ const engine = createGameEngine({
231
+ logging: true,
232
+ // Optional: provide custom shuffle method
233
+ shuffleMethod: (array) => array,
234
+ });
235
+
236
+ // Create a new game with Classic mode
237
+ let game = engine.createGame({ mode: "Classic" });
238
+
239
+ // Add players
240
+ const players = ["Alice", "Bob"];
241
+ game = engine.addPlayers({ game, players });
242
+
243
+ // Start the game
244
+ game = engine.startGame({ game });
245
+
246
+ // Game loop - continue until there are no more actions
247
+ while (isGameWithNextAction(game)) {
248
+ const currentLordId = game.nextAction.nextLord;
249
+ const nextAction = game.nextAction.nextAction;
250
+
251
+ // Handle different actions
252
+ if (nextAction === "pickDomino") {
253
+ // Choose a domino from the available ones
254
+ const dominoToChoose = game.currentDominoes[0].domino.number;
255
+ game = engine.chooseDomino({
256
+ game,
257
+ lordId: currentLordId,
258
+ dominoPick: dominoToChoose,
259
+ });
260
+ } else if (nextAction === "placeDomino") {
261
+ // Try to place the domino
262
+ try {
263
+ game = engine.placeDomino({
264
+ game,
265
+ lordId: currentLordId,
266
+ position: { x: 0, y: 0 }, // Position to place the domino
267
+ rotation: 0, // Rotation of the domino (0, 90, 180, 270)
268
+ });
269
+ } catch (error) {
270
+ // If placement fails, discard the domino
271
+ game = engine.discardDomino({
272
+ game,
273
+ lordId: currentLordId,
274
+ });
275
+ }
276
+ }
277
+ }
278
+
279
+ // Get the final results
280
+ const gameResult = engine.getResults({ game });
281
+ console.log("Game results:", gameResult.result);
282
+ ```
283
+
189
284
  ## Extra Rules
190
285
 
191
286
  The engine supports extra rules that can modify gameplay. Some examples include:
@@ -193,6 +288,13 @@ The engine supports extra rules that can modify gameplay. Some examples include:
193
288
  - **The Middle Kingdom**: Gain 10 additional points if your castle is in the middle of the kingdom.
194
289
  - **Harmony**: Gain 5 additional points if your kingdom is complete (no discarded dominoes).
195
290
 
291
+ You can get all available extra rules for a specific game mode and number of players:
292
+
293
+ ```typescript
294
+ const extraRules = engine.getExtraRules({ mode: "Classic", players: 2 });
295
+ console.log("Available extra rules:", extraRules);
296
+ ```
297
+
196
298
  ## API Documentation
197
299
 
198
300
  ### Key Types and Interfaces
@@ -303,6 +405,57 @@ Calculates and returns the final game results.
303
405
 
304
406
  Calculates and returns the score of a kingdom.
305
407
 
408
+ ## Development
409
+
410
+ ### Setup
411
+
412
+ To set up the project for development:
413
+
414
+ 1. Clone the repository:
415
+ ```bash
416
+ git clone https://github.com/Pompidup/KDomino.git
417
+ cd KDomino
418
+ ```
419
+
420
+ 2. Install dependencies:
421
+ ```bash
422
+ pnpm install
423
+ ```
424
+
425
+ ### Testing
426
+
427
+ The project uses Vitest for testing. To run the tests:
428
+
429
+ ```bash
430
+ # Run all tests
431
+ pnpm test
432
+
433
+ # Run tests with coverage
434
+ pnpm coverage
435
+ ```
436
+
437
+ ### Building
438
+
439
+ To build the project:
440
+
441
+ ```bash
442
+ pnpm build
443
+ ```
444
+
445
+ ## Contributing
446
+
447
+ Contributions are welcome! Here's how you can contribute:
448
+
449
+ 1. Fork the repository
450
+ 2. Create a new branch (`git checkout -b feature/your-feature-name`)
451
+ 3. Make your changes
452
+ 4. Run tests to ensure everything works (`pnpm test`)
453
+ 5. Commit your changes (`git commit -m 'Add some feature'`)
454
+ 6. Push to the branch (`git push origin feature/your-feature-name`)
455
+ 7. Open a Pull Request
456
+
457
+ Please make sure your code follows the existing style and includes appropriate tests.
458
+
306
459
  ## Advanced Usage
307
460
 
308
461
  For more advanced usage and detailed API documentation, please refer to the source code and inline comments.
package/dist/index.d.ts CHANGED
@@ -26,9 +26,9 @@ type Position = {
26
26
  x: number;
27
27
  y: number;
28
28
  };
29
- type Orientation = "vertical" | "horizontal";
30
- type Rotation = 0 | 180;
29
+ type Rotation = 0 | 90 | 180 | 270;
31
30
  type Kingdom = (Tile | EmptyTile)[][];
31
+ declare const GRIDSIZE = 9;
32
32
 
33
33
  type Lord = {
34
34
  id: string;
@@ -51,6 +51,11 @@ type Player = {
51
51
  name: string;
52
52
  kingdom: Kingdom;
53
53
  };
54
+ type PlayerPayload = {
55
+ name: string;
56
+ };
57
+ type PlayersPayload = PlayerPayload[];
58
+ type Players = Player[];
54
59
  declare const playerActions: {
55
60
  readonly placeDomino: "placeDomino";
56
61
  readonly pickDomino: "pickDomino";
@@ -70,11 +75,25 @@ type ExtraRule = {
70
75
  mode: GameMode[];
71
76
  playersLimit?: number;
72
77
  };
78
+ type Rules = {
79
+ basic: Record<number, BasicRules>;
80
+ extraRules: ExtraRule[];
81
+ };
73
82
  type SelectedRules = {
74
83
  basic: BasicRules;
75
84
  extra: ExtraRule[];
76
85
  };
77
86
 
87
+ type Result<T> = Ok<T> | Err;
88
+ interface Ok<T> {
89
+ readonly tag: "Ok";
90
+ readonly value: T;
91
+ }
92
+ interface Err {
93
+ readonly tag: "Err";
94
+ readonly error: string;
95
+ }
96
+
78
97
  type Game = {
79
98
  id: string;
80
99
  dominoes: Domino[];
@@ -109,6 +128,9 @@ type GameWithNextStep = Game & {
109
128
  nextAction: NextStep;
110
129
  };
111
130
  type GameState = GameWithNextAction | GameWithNextStep;
131
+ type GameStateResult = Result<GameState>;
132
+ declare const isGameWithNextAction: (game: GameWithNextAction | GameWithNextStep) => game is GameWithNextAction;
133
+ declare const isGameWithNextStep: (game: GameWithNextAction | GameWithNextStep) => game is GameWithNextStep;
112
134
  type Score = {
113
135
  points: number;
114
136
  maxPropertiesSize: number;
@@ -161,7 +183,6 @@ type PlaceDominoCommand = {
161
183
  game: GameState;
162
184
  lordId: string;
163
185
  position: Position;
164
- orientation: Orientation;
165
186
  rotation: Rotation;
166
187
  };
167
188
 
@@ -204,4 +225,4 @@ type EngineConfig = {
204
225
 
205
226
  declare const createGameEngine: (config: Partial<EngineConfig>) => GameEngine;
206
227
 
207
- export { createGameEngine };
228
+ export { type AddExtraRulesCommand, type AddPlayersCommand, type BasicRules, type CalculateScoreCommand, type ChooseDominoCommand, type CreateGameCommand, type Crown, type DiscardDominoCommand, type Domino, type EmptyGround, type EmptyTile, type ExtraRule, type FinalResult, GRIDSIZE, GROUND, type Game, type GameEngine, type GameMode, type GameState, type GameStateResult, type GameSteps, type GameWithNextAction, type GameWithNextStep, type GameWithResults, type GetExtraRulesCommand, type GetModesCommand, type GetResultCommand, type Ground, type Kingdom, type Lord, type NextAction, type NextStep, type ObjectValues, type PlaceDominoCommand, type Player, type PlayerActions, type PlayerPayload, type Players, type PlayersPayload, type Position, type RevealsDomino, type Rotation, type Rules, type Score, type ScoreResult, type SelectedRules, type ShuffleMethod, type StartGameCommand, type Tile, type UuidMethod, createGameEngine, gameSteps, isGameWithNextAction, isGameWithNextStep, playerActions };
package/dist/index.js CHANGED
@@ -952,11 +952,11 @@ var getResultHandler = (logger, useCases) => (command) => {
952
952
 
953
953
  // src/application/handlers/placeDominoHandler.ts
954
954
  var placeDominoHandler = (logger, useCase) => (command) => {
955
- const { game, lordId, position, orientation, rotation } = command;
955
+ const { game, lordId, position, rotation } = command;
956
956
  logger.info(
957
957
  `Placing domino: ${lordId} in position: ${JSON.stringify(
958
958
  position
959
- )} with orientation: ${orientation} and rotation: ${rotation} in game: ${game.id}`
959
+ )} with rotation: ${rotation} in game: ${game.id}`
960
960
  );
961
961
  if (!isGameWithNextAction(game)) {
962
962
  logger.error(
@@ -972,7 +972,7 @@ var placeDominoHandler = (logger, useCase) => (command) => {
972
972
  );
973
973
  throw new InvalidStepError("Required game with placeDomino step");
974
974
  }
975
- const result = useCase(game, lordId, position, orientation, rotation);
975
+ const result = useCase(game, lordId, position, rotation);
976
976
  if (isErr(result)) {
977
977
  logger.error(`Error placing domino: ${result.error}`);
978
978
  throw new ActionExecutionError(result.error);
@@ -981,14 +981,14 @@ var placeDominoHandler = (logger, useCase) => (command) => {
981
981
  logger.info(
982
982
  `Domino placed: ${lordId} in position: ${JSON.stringify(
983
983
  position
984
- )} with orientation: ${orientation} and rotation: ${rotation} in game: ${game.id}`
984
+ )} with rotation: ${rotation} in game: ${game.id}`
985
985
  );
986
986
  return result.value;
987
987
  }
988
988
  logger.info(
989
989
  `Domino placed: ${lordId} in position: ${JSON.stringify(
990
990
  position
991
- )} with orientation: ${orientation} and rotation: ${rotation} in game: ${game.id}`
991
+ )} with rotation: ${rotation} in game: ${game.id}`
992
992
  );
993
993
  return result.value;
994
994
  };
@@ -1114,11 +1114,10 @@ var createTile = (ground, crowns = 0) => {
1114
1114
  // src/core/domain/entities/kingdom.ts
1115
1115
  var createEmptyKingdom = () => {
1116
1116
  const emptyTile = createTile("empty");
1117
- const grid = Array.from(
1117
+ return Array.from(
1118
1118
  { length: GRIDSIZE },
1119
1119
  () => Array.from({ length: GRIDSIZE }, () => emptyTile)
1120
1120
  );
1121
- return grid;
1122
1121
  };
1123
1122
  var placeCastle = (kingdom) => {
1124
1123
  const castle = createTile("castle");
@@ -1138,11 +1137,11 @@ var getTile = (kingdom, position) => {
1138
1137
  }
1139
1138
  return ok(tile);
1140
1139
  };
1141
- var calculateDominoPosition = (position, orientation, rotation, domino) => {
1140
+ var calculateDominoPosition = (position, rotation, domino) => {
1142
1141
  let firstTile;
1143
1142
  let secondTile;
1144
- if (orientation === "horizontal") {
1145
- if (rotation === 0) {
1143
+ switch (rotation) {
1144
+ case 0:
1146
1145
  firstTile = {
1147
1146
  tile: domino.left,
1148
1147
  position: {
@@ -1157,39 +1156,40 @@ var calculateDominoPosition = (position, orientation, rotation, domino) => {
1157
1156
  y: position.y
1158
1157
  }
1159
1158
  };
1160
- } else {
1159
+ break;
1160
+ case 90:
1161
1161
  firstTile = {
1162
- tile: domino.right,
1162
+ tile: domino.left,
1163
1163
  position: {
1164
1164
  x: position.x,
1165
1165
  y: position.y
1166
1166
  }
1167
1167
  };
1168
1168
  secondTile = {
1169
- tile: domino.left,
1169
+ tile: domino.right,
1170
1170
  position: {
1171
- x: position.x + 1,
1172
- y: position.y
1171
+ x: position.x,
1172
+ y: position.y + 1
1173
1173
  }
1174
1174
  };
1175
- }
1176
- } else {
1177
- if (rotation === 0) {
1175
+ break;
1176
+ case 180:
1178
1177
  firstTile = {
1179
- tile: domino.left,
1178
+ tile: domino.right,
1180
1179
  position: {
1181
1180
  x: position.x,
1182
1181
  y: position.y
1183
1182
  }
1184
1183
  };
1185
1184
  secondTile = {
1186
- tile: domino.right,
1185
+ tile: domino.left,
1187
1186
  position: {
1188
- x: position.x,
1189
- y: position.y + 1
1187
+ x: position.x + 1,
1188
+ y: position.y
1190
1189
  }
1191
1190
  };
1192
- } else {
1191
+ break;
1192
+ case 270:
1193
1193
  firstTile = {
1194
1194
  tile: domino.right,
1195
1195
  position: {
@@ -1204,14 +1204,13 @@ var calculateDominoPosition = (position, orientation, rotation, domino) => {
1204
1204
  y: position.y + 1
1205
1205
  }
1206
1206
  };
1207
- }
1207
+ break;
1208
1208
  }
1209
1209
  return [firstTile, secondTile];
1210
1210
  };
1211
- var placeDomino = (kingdom, position, orientation, rotation, domino) => {
1211
+ var placeDomino = (kingdom, position, rotation, domino) => {
1212
1212
  const [firstTile, secondTile] = calculateDominoPosition(
1213
1213
  position,
1214
- orientation,
1215
1214
  rotation,
1216
1215
  domino
1217
1216
  );
@@ -1326,8 +1325,7 @@ var checkCastleIsInMiddle = (kingdom) => {
1326
1325
  };
1327
1326
  var countDominoes = (kingdom) => {
1328
1327
  const notEmpties = kingdom.flat().filter((tile) => tile.type !== "empty");
1329
- const totalDominoes = (notEmpties.length - 1) / 2;
1330
- return totalDominoes;
1328
+ return (notEmpties.length - 1) / 2;
1331
1329
  };
1332
1330
  var deepCopyKingdom = (kingdom) => {
1333
1331
  return kingdom.map((line) => line.map((tile) => ({ ...tile })));
@@ -1740,7 +1738,7 @@ var getResultUseCase = (game, scoreResult) => {
1740
1738
  };
1741
1739
 
1742
1740
  // src/core/useCases/placeDomino.ts
1743
- var placeDominoUseCase = (game, lordId, position, orientation, rotation) => {
1741
+ var placeDominoUseCase = (game, lordId, position, rotation) => {
1744
1742
  const nextAction = game.nextAction;
1745
1743
  const currentLord = game.lords.find(
1746
1744
  (lord) => lord.id === nextAction.nextLord
@@ -1764,7 +1762,6 @@ var placeDominoUseCase = (game, lordId, position, orientation, rotation) => {
1764
1762
  const updatedKingdom = placeDomino(
1765
1763
  currentPlayer.kingdom,
1766
1764
  position,
1767
- orientation,
1768
1765
  rotation,
1769
1766
  domino
1770
1767
  );
@@ -2021,6 +2018,12 @@ var createGameEngine = (config) => {
2021
2018
  };
2022
2019
  };
2023
2020
  export {
2024
- createGameEngine
2021
+ GRIDSIZE,
2022
+ GROUND,
2023
+ createGameEngine,
2024
+ gameSteps,
2025
+ isGameWithNextAction,
2026
+ isGameWithNextStep,
2027
+ playerActions
2025
2028
  };
2026
2029
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/datasources/dominoes.json","../src/adapterServerside/jsonDominoes.ts","../src/datasources/modes.json","../src/adapterServerside/jsonModes.ts","../src/datasources/rules.json","../src/adapterServerside/jsonRules.ts","../src/adapterServerside/shuffle.ts","../src/adapterServerside/uuid.ts","../src/adapterServerside/winstonLogger.ts","../src/core/domain/errors/domainErrors.ts","../src/core/domain/types/game.ts","../src/utils/result.ts","../src/application/handlers/addExtraRulesHandler.ts","../src/application/handlers/addPlayersHandler.ts","../src/application/handlers/chooseDominoHandler.ts","../src/application/handlers/createGameHandler.ts","../src/application/handlers/discardDominoHandler.ts","../src/application/handlers/getExtraRulesHandler.ts","../src/application/handlers/getModesHandler.ts","../src/application/handlers/getResultHandler.ts","../src/application/handlers/placeDominoHandler.ts","../src/application/handlers/startGameHandler.ts","../src/application/handlers/calculateScoreHandler.ts","../src/core/domain/types/kingdom.ts","../src/core/domain/types/domino.ts","../src/core/domain/types/player.ts","../src/core/domain/entities/rule.ts","../src/core/useCases/addExtraRules.ts","../src/core/domain/entities/domino.ts","../src/core/domain/entities/kingdom.ts","../src/core/domain/entities/player.ts","../src/core/useCases/addPlayers.ts","../src/core/domain/entities/lord.ts","../src/core/useCases/chooseDomino.ts","../src/core/domain/entities/game.ts","../src/core/domain/entities/mode.ts","../src/core/useCases/createGame.ts","../src/core/useCases/discardDomino.ts","../src/core/useCases/getExtraRules.ts","../src/core/useCases/getModes.ts","../src/core/useCases/getResult.ts","../src/core/useCases/placeDomino.ts","../src/core/useCases/startGame.ts","../src/core/useCases/calculateScore.ts","../src/config.ts","../src/index.ts"],"sourcesContent":["{\n \"Classic\": [\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"number\": 1\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"number\": 2\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"number\": 3\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"number\": 4\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"number\": 5\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"number\": 6\n },\n {\n \"left\": {\n \"type\": \"sea\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"sea\",\n \"crowns\": 0\n },\n \"number\": 7\n },\n {\n \"left\": {\n \"type\": \"sea\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"sea\",\n \"crowns\": 0\n },\n \"number\": 8\n },\n {\n \"left\": {\n \"type\": \"sea\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"sea\",\n \"crowns\": 0\n },\n \"number\": 9\n },\n {\n \"left\": {\n \"type\": \"plain\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"plain\",\n \"crowns\": 0\n },\n \"number\": 10\n },\n {\n \"left\": {\n \"type\": \"plain\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"plain\",\n \"crowns\": 0\n },\n \"number\": 11\n },\n {\n \"left\": {\n \"type\": \"swamp\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"swamp\",\n \"crowns\": 0\n },\n \"number\": 12\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"number\": 13\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"sea\",\n \"crowns\": 0\n },\n \"number\": 14\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"plain\",\n \"crowns\": 0\n },\n \"number\": 15\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"swamp\",\n \"crowns\": 0\n },\n \"number\": 16\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"sea\",\n \"crowns\": 0\n },\n \"number\": 17\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"plain\",\n \"crowns\": 0\n },\n \"number\": 18\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"number\": 19\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"sea\",\n \"crowns\": 0\n },\n \"number\": 20\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"plain\",\n \"crowns\": 0\n },\n \"number\": 21\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"swamp\",\n \"crowns\": 0\n },\n \"number\": 22\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"mine\",\n \"crowns\": 0\n },\n \"number\": 23\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"number\": 24\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"number\": 25\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"number\": 26\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"number\": 27\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"sea\",\n \"crowns\": 0\n },\n \"number\": 28\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"plain\",\n \"crowns\": 0\n },\n \"number\": 29\n },\n {\n \"left\": {\n \"type\": \"sea\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"number\": 30\n },\n {\n \"left\": {\n \"type\": \"sea\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"number\": 31\n },\n {\n \"left\": {\n \"type\": \"sea\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"number\": 32\n },\n {\n \"left\": {\n \"type\": \"sea\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"number\": 33\n },\n {\n \"left\": {\n \"type\": \"sea\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"number\": 34\n },\n {\n \"left\": {\n \"type\": \"sea\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"number\": 35\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"plain\",\n \"crowns\": 1\n },\n \"number\": 36\n },\n {\n \"left\": {\n \"type\": \"sea\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"plain\",\n \"crowns\": 1\n },\n \"number\": 37\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"swamp\",\n \"crowns\": 1\n },\n \"number\": 38\n },\n {\n \"left\": {\n \"type\": \"plain\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"swamp\",\n \"crowns\": 0\n },\n \"number\": 39\n },\n {\n \"left\": {\n \"type\": \"mine\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"number\": 40\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"plain\",\n \"crowns\": 2\n },\n \"number\": 41\n },\n {\n \"left\": {\n \"type\": \"sea\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"plain\",\n \"crowns\": 2\n },\n \"number\": 42\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"swamp\",\n \"crowns\": 2\n },\n \"number\": 43\n },\n {\n \"left\": {\n \"type\": \"plain\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"swamp\",\n \"crowns\": 2\n },\n \"number\": 44\n },\n {\n \"left\": {\n \"type\": \"mine\",\n \"crowns\": 2\n },\n \"right\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"number\": 45\n },\n {\n \"left\": {\n \"type\": \"swamp\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"mine\",\n \"crowns\": 2\n },\n \"number\": 46\n },\n {\n \"left\": {\n \"type\": \"swamp\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"mine\",\n \"crowns\": 2\n },\n \"number\": 47\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"mine\",\n \"crowns\": 3\n },\n \"number\": 48\n }\n ]\n}\n","import type { Domino, Ground } from \"@core/domain/types/domino.js\";\nimport type { GameMode } from \"@core/domain/types/mode.js\";\nimport type { DominoesRepository } from \"@core/portServerside/dominoesRepository.js\";\nimport dominoesJson from \"../datasources/dominoes.json\" assert { type: \"json\" };\n\nconst jsonDominoes = (): DominoesRepository => {\n const dominoes: Record<string, Domino[]> = {};\n\n for (const [key, value] of Object.entries(dominoesJson)) {\n const currentDominoes: Domino[] = [];\n value.forEach((domino) => {\n currentDominoes.push({\n left: {\n type: <Ground>domino.left.type,\n crowns: domino.left.crowns,\n },\n right: {\n type: <Ground>domino.right.type,\n crowns: domino.right.crowns,\n },\n number: domino.number,\n });\n });\n\n dominoes[key] = currentDominoes;\n }\n\n return {\n getForMode: (mode: GameMode) => {\n return dominoes[mode.name] || [];\n },\n };\n};\n\nexport default jsonDominoes;\n","[\n {\n \"name\": \"Classic\",\n \"description\": \"Original KingDomino rules\"\n }\n]","import type { GameMode } from \"@core/domain/types/mode.js\";\nimport type { ModeRepository } from \"@core/portServerside/modeRepository.js\";\nimport modesJson from \"../datasources/modes.json\" assert { type: \"json\" };\n\nconst jsonModes = (): ModeRepository => {\n const modes: GameMode[] = [];\n\n modesJson.forEach((mode) => {\n modes.push({\n name: mode.name,\n description: mode.description,\n });\n });\n\n return {\n getAvailables: () => {\n return modes;\n },\n };\n};\n\nexport default jsonModes;\n","{\n \"commun\": [\n {\n \"playersLimit\": 2,\n \"lordsPerPlayer\": 2,\n \"maxDominoes\": 24,\n \"dominoesPerTurn\": 4,\n \"maxTurns\": 6\n },\n {\n \"playersLimit\": 3,\n \"lordsPerPlayer\": 1,\n \"maxDominoes\": 36,\n \"dominoesPerTurn\": 3,\n \"maxTurns\": 12\n },\n {\n \"playersLimit\": 4,\n \"lordsPerPlayer\": 1,\n \"maxDominoes\": 48,\n \"dominoesPerTurn\": 4,\n \"maxTurns\": 12\n }\n ],\n \"extra\": [\n {\n \"name\": \"The middle Kingdom\",\n \"description\": \"Gain 10 additional points if your castle is in the middle of the kingdom.\",\n \"mode\": [{ \"name\": \"Classic\", \"description\": \"King Domino classic mode\" }]\n },\n {\n \"name\": \"Harmony\",\n \"description\": \"Gain 5 additional points if your kingdom is complete (no discarded dominoes).\",\n \"mode\": [{ \"name\": \"Classic\", \"description\": \"King Domino classic mode\" }]\n }\n ]\n}\n","import type { Rules } from \"@core/domain/types/rule.js\";\nimport type { RuleRepository } from \"@core/portServerside/ruleRepository.js\";\nimport rulesJson from \"../datasources/rules.json\" assert { type: \"json\" };\n\nconst jsonRules = (): RuleRepository => {\n const rules: Rules = {\n basic: {},\n extraRules: [],\n };\n\n const commonRules = rulesJson.commun;\n const extraRules = rulesJson.extra;\n\n commonRules.forEach((rule) => {\n rules.basic[rule.playersLimit] = {\n lords: rule.lordsPerPlayer,\n maxDominoes: rule.maxDominoes,\n dominoesPerTurn: rule.dominoesPerTurn,\n maxTurns: rule.maxTurns,\n };\n });\n\n extraRules.forEach((rule) => {\n rules.extraRules.push({\n name: rule.name,\n description: rule.description,\n mode: rule.mode,\n });\n });\n\n return {\n getAll: () => {\n return rules;\n },\n getAllExtra: () => {\n return rules.extraRules;\n },\n };\n};\n\nexport default jsonRules;\n","import type { ShuffleMethod } from \"@core/portServerside/shuffleMethod.js\";\n\nexport const shuffleMethod: ShuffleMethod = <T>(array: T[]) => {\n for (let i = array.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [array[i], array[j]] = [array[j] as T, array[i] as T];\n }\n return array;\n};\n","import type { UuidMethod } from \"@core/portServerside/uuidMethod.js\";\nimport { randomUUID } from \"crypto\";\n\nexport const uuidMethod: UuidMethod = () => {\n return randomUUID();\n};\n","import type { Logger } from \"@core/portServerside/logger.js\";\nimport winston from \"winston\";\n\nexport const winstonLogger = (isLoggingEnabled: boolean): Logger => {\n const myFormat = winston.format.printf(\n ({ level, message, label, timestamp }) => {\n return `${timestamp} [${label}] ${level}: ${message}`;\n }\n );\n\n const logger = winston.createLogger({\n level: \"info\",\n format: winston.format.combine(\n winston.format.label({ label: \"KDomino_Engine\" }),\n winston.format.timestamp(),\n winston.format.simple(),\n winston.format.json(),\n winston.format.colorize(),\n myFormat\n ),\n transports: [new winston.transports.Console()],\n });\n\n return {\n info: (message: string) => {\n if (isLoggingEnabled) {\n logger.info(message);\n }\n return void 0;\n },\n error: (message: string) => {\n if (isLoggingEnabled) {\n logger.error(message);\n }\n return void 0;\n },\n };\n};\n","export class InvalidStepError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"InvalidStepError\";\n }\n}\n\nexport class StepExecutionError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"StepExecutionError\";\n }\n}\n\nexport class ActionExecutionError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ActionExecutionError\";\n }\n}\n\nexport class NotFoundError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"NotFoundError\";\n }\n}\n","import type { Result } from \"@utils/result.js\";\nimport type { Domino, RevealsDomino } from \"./domino.js\";\nimport type { Lord } from \"./lord.js\";\nimport type { GameMode } from \"./mode.js\";\nimport type { Player, PlayerActions } from \"./player.js\";\nimport type { SelectedRules } from \"./rule.js\";\nimport type { ObjectValues } from \"./utils.js\";\n\nexport type Game = {\n id: string;\n dominoes: Domino[];\n currentDominoes: RevealsDomino[];\n players: Player[];\n lords: Lord[];\n turn: number;\n nextAction: NextAction | NextStep;\n rules: SelectedRules;\n mode: GameMode;\n};\n\nexport const gameSteps = {\n addPlayers: \"addPlayers\",\n options: \"options\",\n start: \"start\",\n result: \"result\",\n} as const;\n\nexport type GameSteps = ObjectValues<typeof gameSteps>;\n\nexport type NextAction = {\n type: \"action\";\n nextLord: string;\n nextAction: PlayerActions;\n};\n\nexport type NextStep = {\n type: \"step\";\n step: GameSteps;\n};\n\nexport type GameWithNextAction = Game & { nextAction: NextAction };\nexport type GameWithNextStep = Game & { nextAction: NextStep };\nexport type GameState = GameWithNextAction | GameWithNextStep;\nexport type GameStateResult = Result<GameState>;\n\nexport const isGameWithNextAction = (\n game: GameWithNextAction | GameWithNextStep\n): game is GameWithNextAction => {\n return game.nextAction.type === \"action\";\n};\n\nexport const isGameWithNextStep = (\n game: GameWithNextAction | GameWithNextStep\n): game is GameWithNextStep => {\n return game.nextAction.type === \"step\";\n};\n\nexport type Score = {\n points: number;\n maxPropertiesSize: number;\n totalCrowns: number;\n};\n\nexport type ScoreResult = {\n playerId: string;\n playerName: string;\n details: Score;\n};\n\nexport type FinalResult = ScoreResult & {\n position: number;\n};\n\nexport type GameWithResults = Game & { result: FinalResult[] };\n","export type Result<T> = Ok<T> | Err;\n\nexport interface Ok<T> {\n readonly tag: \"Ok\";\n readonly value: T;\n}\n\nexport interface Err {\n readonly tag: \"Err\";\n readonly error: string;\n}\n\nexport const ok = <T>(value: T): Ok<T> => ({ tag: \"Ok\", value });\nexport const err = (error: string): Err => ({ tag: \"Err\", error });\n\nexport const isOk = <T>(result: Result<T>): result is Ok<T> =>\n result.tag === \"Ok\";\nexport const isErr = <T>(result: Result<T>): result is Err =>\n result.tag === \"Err\";\n\nexport const unwrap = <T>(result: Ok<T> | Err): T => {\n if (result.tag === \"Err\") {\n throw result.error;\n }\n return result.value;\n};\n","import type { Logger } from \"@core/portServerside/logger.js\";\nimport type { AddExtraRulesCommand } from \"@application/commands/addExtraRulesCommand.js\";\nimport {\n InvalidStepError,\n StepExecutionError,\n} from \"@core/domain/errors/domainErrors.js\";\nimport {\n isGameWithNextStep,\n type GameWithNextStep,\n} from \"@core/domain/types/game.js\";\nimport type { AddExtraRulesUseCase } from \"@core/useCases/addExtraRules.js\";\nimport { isErr } from \"@utils/result.js\";\n\ntype AddExtraRulesHandler = (command: AddExtraRulesCommand) => GameWithNextStep;\n\nexport const addExtraRulesHandler =\n (logger: Logger, useCase: AddExtraRulesUseCase): AddExtraRulesHandler =>\n (command: AddExtraRulesCommand) => {\n const { game, extraRules } = command;\n logger.info(`Adding extra rules to game: ${game.id}`);\n logger.info(`Extra rules: ${extraRules}`);\n\n if (!isGameWithNextStep(game)) {\n logger.error(\n `Invalid game, required nextAction type: 'step' but got: ${game.nextAction.type}`\n );\n throw new InvalidStepError(\"Required game with nextAction type: 'step'\");\n }\n\n if (game.nextAction.step !== \"options\") {\n logger.error(\n `Required game with options step but got: ${game.nextAction.step}`\n );\n throw new InvalidStepError(\"Required game with options step\");\n }\n\n const result = useCase(game, extraRules);\n\n if (isErr(result)) {\n logger.error(`Error adding extra rules: ${result.error}`);\n throw new StepExecutionError(result.error);\n }\n\n logger.info(`Extra rules added to game: ${game.id}`);\n return result.value;\n };\n","import type { Logger } from \"@core/portServerside/logger.js\";\nimport type { AddPlayersCommand } from \"@application/commands/addPlayersCommand.js\";\nimport {\n InvalidStepError,\n StepExecutionError,\n} from \"@core/domain/errors/domainErrors.js\";\nimport {\n isGameWithNextStep,\n type GameWithNextStep,\n} from \"@core/domain/types/game.js\";\nimport type { AddPlayersUseCase } from \"@core/useCases/addPlayers.js\";\nimport { isErr } from \"@utils/result.js\";\n\ntype AddPlayersHandler = (command: AddPlayersCommand) => GameWithNextStep;\n\nexport const addPlayersHandler =\n (logger: Logger, useCase: AddPlayersUseCase): AddPlayersHandler =>\n (command: AddPlayersCommand) => {\n const { game, players } = command;\n\n logger.info(`Adding players to game: ${game.id}`);\n\n if (!isGameWithNextStep(game)) {\n logger.error(\n `Invalid game, required nextAction type: 'step' but got: ${game.nextAction.type}`\n );\n throw new InvalidStepError(\"Required game with nextAction type: 'step'\");\n }\n\n if (game.nextAction.step !== \"addPlayers\") {\n logger.error(\n `Required game with addPlayers step but got: ${game.nextAction.step}`\n );\n throw new InvalidStepError(\"Required game with addPlayers step\");\n }\n\n const result = useCase(game, players);\n\n if (isErr(result)) {\n logger.error(`Error adding players: ${result.error}`);\n throw new StepExecutionError(result.error);\n }\n\n logger.info(`Players added to game: ${game.id}`);\n return result.value;\n };\n","import type { Logger } from \"@core/portServerside/logger.js\";\nimport type { ChooseDominoCommand } from \"@application/commands/chooseDominoCommand.js\";\nimport {\n ActionExecutionError,\n InvalidStepError,\n} from \"@core/domain/errors/domainErrors.js\";\nimport {\n isGameWithNextAction,\n type GameWithNextAction,\n} from \"@core/domain/types/game.js\";\nimport type { ChooseDominoUseCase } from \"@core/useCases/chooseDomino.js\";\nimport { isErr } from \"@utils/result.js\";\n\ntype ChooseDominoHandler = (command: ChooseDominoCommand) => GameWithNextAction;\n\nexport const chooseDominoHandler =\n (logger: Logger, useCase: ChooseDominoUseCase): ChooseDominoHandler =>\n (command: ChooseDominoCommand) => {\n const { game, lordId, dominoPick } = command;\n logger.info(\n `Choosing domino: ${dominoPick} for lord: ${lordId} in game: ${game.id}`\n );\n\n if (!isGameWithNextAction(game)) {\n logger.error(\n `Invalid game, required nextAction type: 'action' but got: ${game.nextAction.type}`\n );\n throw new InvalidStepError(\n \"Required game with nextAction type: 'action'\"\n );\n }\n\n if (game.nextAction.nextAction !== \"pickDomino\") {\n logger.error(\n `Required game with pickDomino action but got: ${game.nextAction.nextAction}`\n );\n throw new InvalidStepError(\"Required game with pickDomino action\");\n }\n\n const result = useCase(game, lordId, dominoPick);\n\n if (isErr(result)) {\n logger.error(`Error choosing domino: ${result.error}`);\n throw new ActionExecutionError(result.error);\n }\n\n logger.info(\n `Domino chosen: ${dominoPick} for lord: ${lordId} in game: ${game.id}`\n );\n return result.value;\n };\n","import { StepExecutionError } from \"@core/domain/errors/domainErrors.js\";\nimport type { GameWithNextStep } from \"@core/domain/types/game.js\";\nimport type { CreateGameUseCase } from \"@core/useCases/createGame.js\";\nimport type { CreateGameCommand } from \"@application/commands/createGameCommand.js\";\nimport { isErr } from \"@utils/result.js\";\nimport type { Logger } from \"@core/portServerside/logger.js\";\n\ntype CreateGameHandler = (command: CreateGameCommand) => GameWithNextStep;\n\nexport const createGameHandler =\n (logger: Logger, useCase: CreateGameUseCase): CreateGameHandler =>\n (command: CreateGameCommand) => {\n logger.info(`Creating game with mode: ${command.mode}`);\n const result = useCase(command.mode);\n\n if (isErr(result)) {\n logger.error(`Error creating game: ${result.error}`);\n throw new StepExecutionError(result.error);\n }\n\n logger.info(`Game created: ${result.value.id}`);\n return result.value;\n };\n","import type { Logger } from \"@core/portServerside/logger.js\";\nimport type { DiscardDominoCommand } from \"@application/commands/discardDominoCommand.js\";\nimport {\n ActionExecutionError,\n InvalidStepError,\n} from \"@core/domain/errors/domainErrors.js\";\nimport {\n isGameWithNextAction,\n type GameState,\n} from \"@core/domain/types/game.js\";\nimport type { DiscardDominoUseCase } from \"@core/useCases/discardDomino.js\";\nimport { isErr } from \"@utils/result.js\";\n\ntype DiscardDominoHandler = (command: DiscardDominoCommand) => GameState;\n\nexport const discardDominoHandler =\n (logger: Logger, useCase: DiscardDominoUseCase): DiscardDominoHandler =>\n (command: DiscardDominoCommand) => {\n const { game, lordId } = command;\n logger.info(`Discarding domino for lord: ${lordId} in game: ${game.id}`);\n\n if (!isGameWithNextAction(game)) {\n logger.error(\n `Invalid game, required nextAction type: 'action' but got: ${game.nextAction.type}`\n );\n throw new InvalidStepError(\n \"Required game with nextAction type: 'action'\"\n );\n }\n\n if (game.nextAction.nextAction !== \"placeDomino\") {\n logger.error(\n `Required game with placeDomino action but got: ${game.nextAction.nextAction}`\n );\n throw new InvalidStepError(\"Required game with placeDomino action\");\n }\n\n const result = useCase(game, lordId);\n\n if (isErr(result)) {\n logger.error(`Error discarding domino: ${result.error}`);\n throw new ActionExecutionError(result.error);\n }\n\n if (isGameWithNextAction(result.value)) {\n logger.info(`Domino discarded: ${lordId} in game: ${game.id}`);\n return result.value;\n }\n\n logger.info(`Domino discarded: ${lordId} in game: ${game.id}`);\n return result.value;\n };\n","import type { Logger } from \"@core/portServerside/logger.js\";\nimport type { GetExtraRulesCommand } from \"@application/commands/getExtraRulesCommand.js\";\nimport { NotFoundError } from \"@core/domain/errors/domainErrors.js\";\nimport type { ExtraRule } from \"@core/domain/types/rule.js\";\nimport type { GetExtraRulesUseCase } from \"@core/useCases/getExtraRules.js\";\nimport { isErr } from \"@utils/result.js\";\n\ntype GetExtraRulesHandler = (command: GetExtraRulesCommand) => ExtraRule[];\n\nexport const getExtraRulesHandler =\n (logger: Logger, useCase: GetExtraRulesUseCase): GetExtraRulesHandler =>\n (command: GetExtraRulesCommand) => {\n const { mode, players } = command;\n logger.info(\n `Getting extra rules for mode: ${mode} and players: ${players}`\n );\n const result = useCase(mode, players);\n\n if (isErr(result)) {\n logger.error(`Error getting extra rules: ${result.error}`);\n throw new NotFoundError(result.error);\n }\n\n logger.info(`Extra rules retrieved: ${result.value}`);\n return result.value;\n };\n","import type { Logger } from \"@core/portServerside/logger.js\";\nimport type { GetModesCommand } from \"@application/commands/getModesCommand.js\";\nimport { NotFoundError } from \"@core/domain/errors/domainErrors.js\";\nimport type { GameMode } from \"@core/domain/types/mode.js\";\nimport type { GetModesUseCase } from \"@core/useCases/getModes.js\";\nimport { isErr } from \"@utils/result.js\";\n\ntype GetModesHandler = (command: GetModesCommand) => GameMode[];\n\nexport const getModesHandler =\n (logger: Logger, useCase: GetModesUseCase): GetModesHandler =>\n (_command: GetModesCommand) => {\n logger.info(\"Getting modes\");\n const result = useCase();\n\n if (isErr(result)) {\n logger.error(`Error getting modes: ${result.error}`);\n throw new NotFoundError(result.error);\n }\n\n logger.info(`Modes retrieved: ${result.value}`);\n return result.value;\n };\n","import type { GetResultCommand } from \"@application/commands/getResultCommand.js\";\nimport {\n InvalidStepError,\n NotFoundError,\n StepExecutionError,\n} from \"@core/domain/errors/domainErrors.js\";\nimport {\n isGameWithNextStep,\n type GameWithResults,\n type ScoreResult,\n} from \"@core/domain/types/game.js\";\nimport type { Logger } from \"@core/portServerside/logger.js\";\nimport type { CalculateScoreUseCase } from \"@core/useCases/calculateScore.js\";\nimport type { GetResultUseCase } from \"@core/useCases/getResult.js\";\nimport { isErr } from \"@utils/result.js\";\n\ntype GetResultHandler = (command: GetResultCommand) => GameWithResults;\n\nexport const getResultHandler =\n (\n logger: Logger,\n useCases: {\n getResultUseCase: GetResultUseCase;\n calculateScoreUseCase: CalculateScoreUseCase;\n }\n ): GetResultHandler =>\n (command: GetResultCommand) => {\n const { getResultUseCase, calculateScoreUseCase } = useCases;\n const { game } = command;\n logger.info(`Getting result for game: ${game.id}`);\n\n if (!isGameWithNextStep(game)) {\n logger.error(\n `Invalid game, required nextAction type: 'step' but got: ${game.nextAction.type}`\n );\n throw new InvalidStepError(\"Required game with nextAction type: 'step'\");\n }\n\n if (game.nextAction.step !== \"result\") {\n logger.error(\n `Required game with result step but got: ${game.nextAction.step}`\n );\n throw new InvalidStepError(\"Required game with result step\");\n }\n\n let scoreResult: ScoreResult[];\n const { players } = game;\n\n scoreResult = players.map((player) => {\n const { kingdom } = player;\n const result = calculateScoreUseCase(kingdom);\n\n if (isErr(result)) {\n logger.error(`Error when calculating score: ${result.error}`);\n throw new StepExecutionError(result.error);\n }\n\n return {\n playerId: player.id,\n playerName: player.name,\n details: {\n ...result.value,\n },\n };\n });\n\n const result = getResultUseCase(game, scoreResult);\n\n if (isErr(result)) {\n logger.error(`Error getting result: ${result.error}`);\n throw new NotFoundError(result.error);\n }\n\n logger.info(`Result retrieved for game: ${game.id}`);\n return result.value;\n };\n","import type { Logger } from \"@core/portServerside/logger.js\";\nimport type { PlaceDominoCommand } from \"@application/commands/placeDominoCommand.js\";\nimport {\n ActionExecutionError,\n InvalidStepError,\n} from \"@core/domain/errors/domainErrors.js\";\nimport {\n isGameWithNextAction,\n type GameState,\n} from \"@core/domain/types/game.js\";\nimport type { PlaceDominoUseCase } from \"@core/useCases/placeDomino.js\";\nimport { isErr } from \"@utils/result.js\";\n\ntype PlaceDominoHandler = (command: PlaceDominoCommand) => GameState;\n\nexport const placeDominoHandler =\n (logger: Logger, useCase: PlaceDominoUseCase): PlaceDominoHandler =>\n (command: PlaceDominoCommand) => {\n const { game, lordId, position, orientation, rotation } = command;\n logger.info(\n `Placing domino: ${lordId} in position: ${JSON.stringify(\n position\n )} with orientation: ${orientation} and rotation: ${rotation} in game: ${\n game.id\n }`\n );\n\n if (!isGameWithNextAction(game)) {\n logger.error(\n `Invalid game, required nextAction type: 'action' but got: ${game.nextAction.type}`\n );\n throw new InvalidStepError(\n \"Required game with nextAction type: 'action'\"\n );\n }\n\n if (game.nextAction.nextAction !== \"placeDomino\") {\n logger.error(\n `Required game with placeDomino action but got: ${game.nextAction.nextAction}`\n );\n throw new InvalidStepError(\"Required game with placeDomino step\");\n }\n\n const result = useCase(game, lordId, position, orientation, rotation);\n\n if (isErr(result)) {\n logger.error(`Error placing domino: ${result.error}`);\n throw new ActionExecutionError(result.error);\n }\n\n if (isGameWithNextAction(result.value)) {\n logger.info(\n `Domino placed: ${lordId} in position: ${JSON.stringify(\n position\n )} with orientation: ${orientation} and rotation: ${rotation} in game: ${\n game.id\n }`\n );\n return result.value;\n }\n\n logger.info(\n `Domino placed: ${lordId} in position: ${JSON.stringify(\n position\n )} with orientation: ${orientation} and rotation: ${rotation} in game: ${\n game.id\n }`\n );\n return result.value;\n };\n","import type { Logger } from \"@core/portServerside/logger.js\";\nimport type { StartGameCommand } from \"@application/commands/startGameCommand.js\";\nimport {\n InvalidStepError,\n StepExecutionError,\n} from \"@core/domain/errors/domainErrors.js\";\nimport {\n isGameWithNextStep,\n type GameWithNextAction,\n} from \"@core/domain/types/game.js\";\nimport type { StartGameUseCase } from \"@core/useCases/startGame.js\";\nimport { isErr } from \"@utils/result.js\";\n\ntype StartGameHandler = (command: StartGameCommand) => GameWithNextAction;\n\nexport const startGameHandler =\n (logger: Logger, useCase: StartGameUseCase): StartGameHandler =>\n (command: StartGameCommand) => {\n const { game } = command;\n logger.info(`Starting game: ${game.id}`);\n\n if (!isGameWithNextStep(game)) {\n logger.error(\n `Invalid game, required nextAction type: 'step' but got: ${game.nextAction.type}`\n );\n throw new InvalidStepError(\"Required game with nextAction type: 'step'\");\n }\n\n if (\n game.nextAction.step !== \"start\" &&\n game.nextAction.step !== \"options\"\n ) {\n logger.error(\n `Required game with start step or options step but got: ${game.nextAction.step}`\n );\n throw new InvalidStepError(\n \"Required game with start step or options step\"\n );\n }\n\n const result = useCase(game);\n\n if (isErr(result)) {\n logger.error(`Error starting game: ${result.error}`);\n throw new StepExecutionError(result.error);\n }\n\n logger.info(`Game started: ${game.id}`);\n return result.value;\n };\n","import type { CalculateScoreCommand } from \"@application/commands/calculateScoreCommand.js\";\nimport type { Score } from \"@core/domain/types/game.js\";\nimport type { Logger } from \"@core/portServerside/logger.js\";\nimport type { CalculateScoreUseCase } from \"@core/useCases/calculateScore.js\";\nimport { isErr } from \"@utils/result.js\";\n\ntype CalculateScoreHandler = (command: CalculateScoreCommand) => Score;\n\nexport const calculateScoreHandler =\n (logger: Logger, useCase: CalculateScoreUseCase): CalculateScoreHandler =>\n (command) => {\n const { kingdom } = command;\n logger.info(`Calculating score for kingdom`);\n const result = useCase(kingdom);\n\n if (isErr(result)) {\n logger.error(`Error calculating score: ${result.error}`);\n throw new Error(result.error);\n }\n\n logger.info(`Score calculated: ${result.value}`);\n return result.value;\n };\n","import type { EmptyTile, Tile } from \"./domino.js\";\n\nexport type Position = {\n x: number; // cols\n y: number; // rows\n};\n\nexport type Orientation = \"vertical\" | \"horizontal\";\n\nexport type Rotation = 0 | 180;\n\nexport type Kingdom = (Tile | EmptyTile)[][];\n\nexport const GRIDSIZE = 9;\n","export const GROUND = [\n \"castle\",\n \"wheat\",\n \"forest\",\n \"sea\",\n \"plain\",\n \"swamp\",\n \"mine\",\n] as const;\n\nexport type Ground = (typeof GROUND)[number];\nexport type EmptyGround = \"empty\";\n\nexport type Crown = number;\n\nexport type Tile = {\n type: Ground;\n crowns: Crown;\n};\n\nexport type EmptyTile = {\n type: EmptyGround;\n crowns: 0;\n};\n\nexport type Domino = {\n left: Tile;\n right: Tile;\n number: number;\n};\n\nexport type RevealsDomino = {\n domino: Domino;\n picked: boolean;\n lordId: string | null;\n position: number;\n};\n","import type { Kingdom } from \"./kingdom.js\";\nimport type { ObjectValues } from \"./utils.js\";\n\nexport type Player = {\n id: string;\n name: string;\n kingdom: Kingdom;\n};\n\nexport type PlayerPayload = {\n name: string;\n};\n\nexport type PlayersPayload = PlayerPayload[];\n\nexport type Players = Player[];\n\nexport const playerActions = {\n placeDomino: \"placeDomino\",\n pickDomino: \"pickDomino\",\n pass: \"pass\",\n} as const;\n\nexport type PlayerActions = ObjectValues<typeof playerActions>;\n","import type { ExtraRule } from \"@core/domain/types/rule.js\";\nimport { ok, err, type Result } from \"@utils/result.js\";\n\nexport const getAvailablesExtraRules = (\n extraRules: ExtraRule[],\n mode: string,\n numberOfPlayers: number\n): Result<ExtraRule[]> => {\n const availableExtraRules = extraRules.filter((rule) => {\n return (\n rule.mode.filter((m) => m.name === mode).length > 0 &&\n (!rule.playersLimit || rule.playersLimit === numberOfPlayers)\n );\n });\n\n if (availableExtraRules.length === 0) {\n return err(\"No extra rules found\");\n }\n\n return ok(availableExtraRules);\n};\n\nexport const toExtraRule = (\n rule: string,\n extraRules: ExtraRule[]\n): Result<ExtraRule> => {\n const foundRule = extraRules.find((r) => r.name === rule);\n\n if (!foundRule) {\n return err(`Rule not found: ${rule}`);\n }\n\n return ok(foundRule);\n};\n","import {\n gameSteps,\n type ExtraRule,\n type GameWithNextStep,\n type NextStep,\n} from \"@core/domain/types/index.js\";\nimport { isErr, ok, type Result } from \"@utils/result.js\";\nimport type { RuleRepository } from \"@core/portServerside/ruleRepository.js\";\nimport { toExtraRule } from \"@core/domain/entities/rule.js\";\n\nexport type AddExtraRulesUseCase = (\n game: GameWithNextStep,\n rules: string[]\n) => Result<GameWithNextStep>;\n\nexport const addExtraRulesUseCase =\n (deps: { ruleRepository: RuleRepository }): AddExtraRulesUseCase =>\n (game, rules) => {\n const { ruleRepository } = deps;\n const availableExtraRules = ruleRepository.getAllExtra();\n\n const newExtraRules: ExtraRule[] = [];\n\n for (const rule of rules) {\n const result = toExtraRule(rule, availableExtraRules);\n\n if (isErr(result)) {\n return result;\n }\n\n newExtraRules.push(result.value);\n }\n\n const updatedRules = {\n basic: game.rules.basic,\n extra: newExtraRules,\n };\n\n const next: NextStep = {\n type: \"step\",\n step: gameSteps.start,\n };\n\n const updatedGame: GameWithNextStep = {\n ...game,\n rules: updatedRules,\n nextAction: next,\n };\n\n return ok(updatedGame);\n };\n","import {\n GROUND,\n type Crown,\n type EmptyGround,\n type EmptyTile,\n type Ground,\n type Tile,\n} from \"@core/domain/types/domino.js\";\n\nconst isGround = (ground: any): ground is Ground => {\n return GROUND.includes(ground);\n};\n\nexport const createTile = (\n ground: Ground | EmptyGround,\n crowns: Crown = 0\n): Tile | EmptyTile => {\n if (isGround(ground)) {\n return { type: ground, crowns } as Tile;\n }\n return { type: ground, crowns: 0 } as EmptyTile;\n};\n","import {\n GRIDSIZE,\n type Domino,\n type EmptyTile,\n type Kingdom,\n type Orientation,\n type Position,\n type Rotation,\n type Tile,\n} from \"@core/domain/types/index.js\";\nimport { err, isErr, isOk, ok, type Result } from \"@utils/result.js\";\nimport { createTile } from \"./domino.js\";\n\nexport const createEmptyKingdom = (): Kingdom => {\n const emptyTile = createTile(\"empty\");\n const grid = Array.from({ length: GRIDSIZE }, () =>\n Array.from({ length: GRIDSIZE }, () => emptyTile)\n );\n\n return grid;\n};\n\nexport const placeCastle = (kingdom: Kingdom): Kingdom => {\n const castle = createTile(\"castle\");\n const newKingdom = deepCopyKingdom(kingdom);\n newKingdom[4]![4] = castle;\n return newKingdom;\n};\n\nexport const placeTile = (\n kingdom: Kingdom,\n position: Position,\n tile: Tile\n): Kingdom => {\n const newKingdom = deepCopyKingdom(kingdom);\n newKingdom[position.y]![position.x] = tile;\n return newKingdom;\n};\n\nexport const getTile = (\n kingdom: Kingdom,\n position: Position\n): Result<Tile | EmptyTile> => {\n const tile = kingdom[position.y]?.[position.x];\n if (!tile) {\n return err(\"Invalid placement (not fit into the grid)\");\n }\n return ok(tile);\n};\n\nexport const calculateDominoPosition = (\n position: Position,\n orientation: Orientation,\n rotation: Rotation,\n domino: Domino\n): [{ tile: Tile; position: Position }, { tile: Tile; position: Position }] => {\n let firstTile: {\n tile: Tile;\n position: Position;\n };\n let secondTile: {\n tile: Tile;\n position: Position;\n };\n\n if (orientation === \"horizontal\") {\n if (rotation === 0) {\n firstTile = {\n tile: domino.left,\n position: {\n x: position.x,\n y: position.y,\n },\n };\n secondTile = {\n tile: domino.right,\n position: {\n x: position.x + 1,\n y: position.y,\n },\n };\n } else {\n firstTile = {\n tile: domino.right,\n position: {\n x: position.x,\n y: position.y,\n },\n };\n secondTile = {\n tile: domino.left,\n position: {\n x: position.x + 1,\n y: position.y,\n },\n };\n }\n } else {\n if (rotation === 0) {\n firstTile = {\n tile: domino.left,\n position: {\n x: position.x,\n y: position.y,\n },\n };\n secondTile = {\n tile: domino.right,\n position: {\n x: position.x,\n y: position.y + 1,\n },\n };\n } else {\n firstTile = {\n tile: domino.right,\n position: {\n x: position.x,\n y: position.y,\n },\n };\n secondTile = {\n tile: domino.left,\n position: {\n x: position.x,\n y: position.y + 1,\n },\n };\n }\n }\n\n return [firstTile, secondTile];\n};\n\nexport const placeDomino = (\n kingdom: Kingdom,\n position: Position,\n orientation: Orientation,\n rotation: Rotation,\n domino: Domino\n): Result<Kingdom> => {\n const [firstTile, secondTile] = calculateDominoPosition(\n position,\n orientation,\n rotation,\n domino\n );\n\n const isFreePlaceResult = isFreePlace(\n kingdom,\n firstTile.position,\n secondTile.position\n );\n if (isErr(isFreePlaceResult)) {\n return isFreePlaceResult;\n }\n\n const adjacentTiles = isAdjacent(\n kingdom,\n firstTile.position,\n secondTile.position\n );\n\n if (adjacentTiles.length === 0) {\n return err(\"Invalid placement (not adjacent)\");\n }\n\n const hasValidAdjacentTiles = hasValidAdjacent(adjacentTiles, [\n firstTile.tile,\n secondTile.tile,\n ]);\n\n if (!hasValidAdjacentTiles) {\n return err(\"Invalid placement (not valid adjacent)\");\n }\n\n return ok(placeTiles(kingdom, [firstTile, secondTile]));\n};\n\nconst placeTiles = (\n kingdom: Kingdom,\n tiles: { tile: Tile; position: Position }[]\n) => {\n let newKingdom = deepCopyKingdom(kingdom);\n for (const { tile, position } of tiles) {\n newKingdom = placeTile(newKingdom, position, tile);\n }\n return newKingdom;\n};\n\nconst isFreePlace = (\n kingdom: Kingdom,\n firstPosition: Position,\n secondPosition: Position\n): Result<boolean> => {\n const firstTile = getTile(kingdom, firstPosition);\n const secondTile = getTile(kingdom, secondPosition);\n\n if (isErr(firstTile)) {\n return firstTile;\n }\n\n if (isErr(secondTile)) {\n return secondTile;\n }\n\n if (firstTile.value.type !== \"empty\" || secondTile.value.type !== \"empty\") {\n return err(\"Invalid placement (not empty)\");\n }\n\n return ok(true);\n};\n\nconst isAdjacent = (\n kingdom: Kingdom,\n firstPosition: Position,\n secondPosition: Position\n): Tile[] => {\n const xFirstPosition = firstPosition.x;\n const yFirstPosition = firstPosition.y;\n const xSecondPosition = secondPosition.x;\n const ySecondPosition = secondPosition.y;\n\n const adjacentTiles: Tile[] = [];\n const adjacentTilesKeys = [\n { x: xFirstPosition - 1, y: yFirstPosition },\n { x: xFirstPosition, y: yFirstPosition - 1 },\n { x: xFirstPosition + 1, y: yFirstPosition },\n { x: xFirstPosition, y: yFirstPosition + 1 },\n { x: xSecondPosition - 1, y: ySecondPosition },\n { x: xSecondPosition, y: ySecondPosition - 1 },\n { x: xSecondPosition + 1, y: ySecondPosition },\n { x: xSecondPosition, y: ySecondPosition + 1 },\n ];\n\n // Remove firstPosition and secondPosition from adjacentTilesKeys\n adjacentTilesKeys.splice(\n adjacentTilesKeys.findIndex((pos) => {\n return pos.x === xFirstPosition && pos.y === yFirstPosition;\n }),\n 1\n );\n\n adjacentTilesKeys.splice(\n adjacentTilesKeys.findIndex((pos) => {\n return pos.x === xSecondPosition && pos.y === ySecondPosition;\n }),\n 1\n );\n\n adjacentTilesKeys.forEach((key) => {\n const tile = getTile(kingdom, key);\n if (isOk(tile)) {\n if (tile.value.type !== \"empty\") {\n adjacentTiles.push(tile.value);\n }\n }\n });\n\n return adjacentTiles;\n};\n\nconst hasValidAdjacent = (\n adjacentTiles: (Tile | EmptyTile)[],\n tiles: Tile[]\n): boolean => {\n return adjacentTiles.some((adjacentTile) => {\n return tiles.some((tile) => {\n return tile.type === adjacentTile.type || adjacentTile.type === \"castle\";\n });\n });\n};\n\nexport const checkCastleIsInMiddle = (kingdom: Kingdom): boolean => {\n // Find index of castle\n const castlePosition = kingdom\n .map((row) => row.findIndex((tile) => tile.type === \"castle\"))\n .find((index) => index !== -1);\n\n // Count how many tiles not empty are on the left of the castle\n const leftTiles =\n castlePosition !== undefined\n ? kingdom[castlePosition]!.slice(0, castlePosition)\n : [];\n const leftTilesCount = leftTiles.filter(\n (tile) => tile.type !== \"empty\"\n ).length;\n\n // Count how many tiles not empty are on the right of the castle\n const rightTiles =\n castlePosition !== undefined\n ? kingdom[castlePosition]!.slice(castlePosition + 1)\n : [];\n const rightTilesCount = rightTiles.filter(\n (tile) => tile.type !== \"empty\"\n ).length;\n\n // Count how many tiles not empty are on the top of the castle\n const topTiles =\n castlePosition !== undefined\n ? kingdom[castlePosition]!.slice(0, castlePosition)\n : [];\n const topTilesCount = topTiles.filter((tile) => tile.type !== \"empty\").length;\n\n // Count how many tiles not empty are on the bottom of the castle\n const bottomTiles =\n castlePosition != undefined\n ? kingdom[castlePosition]!.slice(castlePosition + 1)\n : [];\n const bottomTilesCount = bottomTiles.filter(\n (tile) => tile.type !== \"empty\"\n ).length;\n\n return (\n leftTilesCount === rightTilesCount &&\n topTilesCount === bottomTilesCount &&\n leftTilesCount === topTilesCount\n );\n};\n\nexport const countDominoes = (kingdom: Kingdom): number => {\n const notEmpties = kingdom.flat().filter((tile) => tile.type !== \"empty\");\n const totalDominoes = (notEmpties.length - 1) / 2; // -1 because the castle is not a domino\n return totalDominoes;\n};\n\nconst deepCopyKingdom = (kingdom: Kingdom): Kingdom => {\n return kingdom.map((line) => line.map((tile) => ({ ...tile })));\n};\n","import { type Result, err, ok, isErr } from \"@utils/result.js\";\nimport type { Player } from \"@core/domain/types/player.js\";\nimport type { Kingdom } from \"@core/domain/types/kingdom.js\";\n\nconst MINPLAYERSNAMELENGTH = 3;\n\nexport const validatePlayer = (name: string): Result<string> => {\n if (!name || name.trim().length < MINPLAYERSNAMELENGTH) {\n return err(`Invalid player name: ${name}`);\n }\n\n return ok(name);\n};\n\nexport const createPlayer = (\n playerName: string,\n id: string,\n kingdom: Kingdom\n): Result<Player> => {\n const name = validatePlayer(playerName);\n\n if (isErr(name)) {\n return name;\n }\n\n return ok({\n name: name.value,\n id,\n kingdom,\n });\n};\n","import {\n createEmptyKingdom,\n placeCastle,\n} from \"@core/domain/entities/kingdom.js\";\nimport { createPlayer } from \"@core/domain/entities/player.js\";\nimport type {\n GameWithNextStep,\n NextStep,\n Players,\n} from \"@core/domain/types/index.js\";\nimport type { RuleRepository } from \"@core/portServerside/ruleRepository.js\";\nimport type { ShuffleMethod } from \"@core/portServerside/shuffleMethod.js\";\nimport type { UuidMethod } from \"@core/portServerside/uuidMethod.js\";\nimport { err, isErr, ok, type Result } from \"@utils/result.js\";\n\nexport type AddPlayersUseCase = (\n game: GameWithNextStep,\n players: string[]\n) => Result<GameWithNextStep>;\n\nexport const addPlayersUseCase =\n (deps: {\n uuidMethod: UuidMethod;\n shuffleMethod: ShuffleMethod;\n ruleRepository: RuleRepository;\n }): AddPlayersUseCase =>\n (game, players) => {\n const { uuidMethod, shuffleMethod, ruleRepository } = deps;\n\n if (!players || players.length < 2 || players.length > 4) {\n return err(\"Invalid number of players\");\n }\n\n const newPlayers: Players = [];\n\n for (const player of players) {\n let kingdom = createEmptyKingdom();\n kingdom = placeCastle(kingdom);\n let id = uuidMethod();\n const newPlayer = createPlayer(player, id, kingdom);\n\n if (isErr(newPlayer)) {\n return newPlayer;\n }\n\n newPlayers.push(newPlayer.value);\n }\n\n // set rules\n const rules = ruleRepository.getAll();\n const basicRules = rules.basic[newPlayers.length];\n\n if (!basicRules) {\n return err(\"No base rules found\");\n }\n\n // updateDominoes\n const dominoes = game.dominoes;\n const { maxDominoes } = basicRules;\n const shuffledDominoes = shuffleMethod(dominoes);\n const splicedDominoes = shuffledDominoes.slice(0, maxDominoes);\n const next: NextStep = {\n type: \"step\",\n step: \"options\",\n };\n\n const updatedGame: GameWithNextStep = {\n ...game,\n players: newPlayers,\n dominoes: splicedDominoes,\n rules: {\n ...game.rules,\n basic: basicRules,\n },\n nextAction: next,\n };\n\n return ok(updatedGame);\n };\n","import type { NextAction } from \"@core/domain/types/game.js\";\nimport type { Lord } from \"@core/domain/types/lord.js\";\nimport { playerActions } from \"@core/domain/types/player.js\";\n\nexport const createLord = (id: string, playerId: string): Lord => {\n return {\n id,\n playerId,\n turnEnded: false,\n hasPick: false,\n hasPlace: true,\n };\n};\n\nconst hasPick = (lord: Lord): boolean => lord.hasPick;\nconst hasPlace = (lord: Lord): boolean => lord.hasPlace;\nconst hasTurnEnded = (lord: Lord): boolean => lord.turnEnded;\n\nexport const canPass = (lord: Lord): boolean => {\n return !hasPick(lord) && !hasPlace(lord) && !hasTurnEnded(lord);\n};\n\nexport const canPick = (lord: Lord): boolean => {\n return !hasPick(lord) && hasPlace(lord) && !hasTurnEnded(lord);\n};\n\nexport const canPlaceAndDominoPickedIsDefined = (\n lord: Lord\n): lord is Required<Lord & Pick<Lord, \"dominoPicked\">> => {\n return (\n !hasPick(lord) &&\n !hasPlace(lord) &&\n !hasTurnEnded(lord) &&\n lord.dominoPicked !== undefined\n );\n};\n\nexport const updateLordOrder = (lords: Lord[]): Lord[] => {\n return lords.sort((a, b) => {\n return a.dominoPicked!.number - b.dominoPicked!.number;\n });\n};\n\nexport const resetLordsActions = (lord: Lord[]): Lord[] => {\n const lordsCopy = [...lord];\n for (const lord of lordsCopy) {\n lord.turnEnded = false;\n lord.hasPick = false;\n lord.hasPlace = false;\n }\n\n return lordsCopy;\n};\n\nexport const nextLordWithAction = (lords: Lord[]): NextAction => {\n const nextLord = findNextLord(lords);\n\n return {\n type: \"action\",\n nextLord: nextLord.id,\n nextAction: hasPlace(nextLord)\n ? playerActions.pickDomino\n : playerActions.placeDomino,\n };\n};\n\nconst findNextLord = (lords: Lord[]): Lord => {\n const lord = lords.find((lord) => !hasTurnEnded(lord));\n if (!lord) {\n return lords[0]!;\n }\n return lord;\n};\n\nexport const allLordsHavePlayed = (lords: Lord[]) => {\n return lords.every((lord) => lord.turnEnded);\n};\n","import {\n allLordsHavePlayed,\n canPick,\n nextLordWithAction,\n resetLordsActions,\n updateLordOrder,\n} from \"@core/domain/entities/lord.js\";\nimport type { GameWithNextAction } from \"@core/domain/types/game.js\";\nimport { err, ok, type Result } from \"@utils/result.js\";\n\nexport type ChooseDominoUseCase = (\n game: GameWithNextAction,\n lordId: string,\n dominoPick: number\n) => Result<GameWithNextAction>;\n\nexport const chooseDominoUseCase: ChooseDominoUseCase = (\n game,\n lordId,\n dominoPick\n) => {\n const currentLord = game.lords.find(\n (lord) => lord.id === game.nextAction.nextLord\n );\n\n if (!currentLord) {\n return err(\"Lord not found\");\n }\n\n if (currentLord.id !== lordId) {\n return err(\"Not your turn\");\n }\n\n if (!canPick(currentLord)) {\n return err(\"Lord can't pick\");\n }\n\n // Check if dominoPick is valid choice\n const selectedDomino = game.currentDominoes.find(\n (domino) => domino.domino.number === dominoPick\n );\n\n if (!selectedDomino) {\n return err(\"Domino not found\");\n }\n\n if (selectedDomino.picked) {\n return err(\"Domino already picked\");\n }\n\n // update currentDominoes\n const updatedCurrentDominoes = game.currentDominoes.map((domino) => {\n if (domino.domino.number === dominoPick) {\n domino.picked = true;\n domino.lordId = currentLord.id;\n }\n return domino;\n });\n\n // update lords\n const updatedLords = game.lords.map((lord) => {\n if (lord.id === currentLord.id) {\n lord.hasPick = true;\n lord.turnEnded = true;\n lord.dominoPicked = selectedDomino.domino;\n }\n return lord;\n });\n\n const turnEnded = allLordsHavePlayed(updatedLords);\n\n if (turnEnded) {\n const lords = resetLordsActions(updateLordOrder(updatedLords));\n const updatedTurn = game.turn + 1;\n const next = nextLordWithAction(lords);\n const dominoesCopy = [...game.dominoes];\n const dominoesDrawn = dominoesCopy.splice(\n 0,\n game.rules.basic.dominoesPerTurn\n );\n dominoesDrawn.sort((a, b) => a.number - b.number);\n const updatedCurrentDominoes = dominoesDrawn.map((domino, index) => {\n return {\n domino,\n picked: false,\n lordId: null,\n position: index + 1,\n };\n });\n\n return ok({\n ...game,\n currentDominoes: updatedCurrentDominoes,\n dominoes: dominoesCopy,\n lords,\n turn: updatedTurn,\n nextAction: next,\n });\n }\n\n const next = nextLordWithAction(updatedLords);\n\n // update state\n const updatedState = {\n ...game,\n currentDominoes: updatedCurrentDominoes,\n lords: updatedLords,\n nextAction: next,\n };\n\n return ok(updatedState);\n};\n","import {\n gameSteps,\n type Domino,\n type GameMode,\n type GameWithNextStep,\n} from \"@core/domain/types/index.js\";\n\nexport const create = (payload: {\n id: string;\n mode: GameMode;\n dominoes: Domino[];\n}): GameWithNextStep => {\n const { id, mode, dominoes } = payload;\n return {\n id,\n dominoes,\n currentDominoes: [],\n players: [],\n lords: [],\n turn: 0,\n nextAction: {\n type: \"step\",\n step: gameSteps.addPlayers,\n },\n rules: {\n basic: {\n lords: 0,\n maxDominoes: 0,\n dominoesPerTurn: 0,\n maxTurns: 0,\n },\n extra: [],\n },\n mode,\n };\n};\n","import { err, ok, type Result } from \"@utils/result.js\";\nimport type { GameMode } from \"@core/domain/types/mode.js\";\n\nconst findMode = (\n mode: string,\n availableMode: GameMode[]\n): GameMode | undefined => {\n return availableMode.find((m) => m.name === mode);\n};\n\nexport const createMode = (\n mode: string,\n availableMode: GameMode[]\n): Result<GameMode> => {\n const foundMode = findMode(mode, availableMode);\n if (foundMode) {\n return ok(foundMode);\n }\n\n return err(`Invalid mode: ${mode}`);\n};\n","import { create } from \"@core/domain/entities/game.js\";\nimport { createMode } from \"@core/domain/entities/mode.js\";\nimport type { GameWithNextStep } from \"@core/domain/types/game.js\";\nimport type { DominoesRepository } from \"@core/portServerside/dominoesRepository.js\";\nimport type { ModeRepository } from \"@core/portServerside/modeRepository.js\";\nimport type { UuidMethod } from \"@core/portServerside/uuidMethod.js\";\nimport { err, isErr, ok, type Result } from \"@utils/result.js\";\n\nexport type CreateGameUseCase = (mode: string) => Result<GameWithNextStep>;\n\nexport const createGameUseCase =\n (deps: {\n modeRepository: ModeRepository;\n dominoesRepository: DominoesRepository;\n uuidMethod: UuidMethod;\n }): CreateGameUseCase =>\n (mode) => {\n const { modeRepository, dominoesRepository, uuidMethod } = deps;\n const id = uuidMethod();\n const availableMode = modeRepository.getAvailables();\n const newMode = createMode(mode, availableMode);\n\n if (isErr(newMode)) {\n return newMode;\n }\n\n const dominoes = dominoesRepository.getForMode(newMode.value);\n\n if (!dominoes || dominoes.length === 0) {\n return err(`No dominoes found for mode ${newMode.value.name}`);\n }\n\n const payload = {\n id,\n mode: newMode.value,\n dominoes,\n };\n\n const newGame = create(payload);\n\n return ok(newGame);\n };\n","import {\n allLordsHavePlayed,\n canPass,\n nextLordWithAction,\n} from \"@core/domain/entities/lord.js\";\nimport {\n gameSteps,\n type GameState,\n type GameStateResult,\n type GameWithNextAction,\n type NextAction,\n type NextStep,\n} from \"@core/domain/types/game.js\";\nimport { err, ok } from \"@utils/result.js\";\n\nexport type DiscardDominoUseCase = (\n game: GameWithNextAction,\n lordId: string\n) => GameStateResult;\n\nexport const discardDominoUseCase: DiscardDominoUseCase = (game, lordId) => {\n const nextAction = game.nextAction;\n\n const currentLord = game.lords.find(\n (lord) => lord.id === nextAction.nextLord\n );\n\n if (!currentLord) {\n return err(\"Lord not found\");\n }\n\n if (currentLord.id !== lordId) {\n return err(\"Not your turn\");\n }\n\n if (!canPass(currentLord)) {\n return err(\"Lord can't pass\");\n }\n\n const maxTurns = game.rules.basic.maxTurns;\n const currentTurn = game.turn;\n const isLastTurn = currentTurn === maxTurns;\n\n const updatedLord = game.lords.map((lord) => {\n if (lord.id === currentLord.id) {\n if (isLastTurn) {\n return {\n ...lord,\n turnEnded: true,\n hasPlace: true,\n };\n }\n\n return {\n ...lord,\n hasPlace: true,\n };\n }\n return lord;\n });\n\n let updatedGame: GameState;\n\n const resultStep: NextStep = {\n type: \"step\",\n step: gameSteps.result,\n };\n\n if (isLastTurn && allLordsHavePlayed(updatedLord)) {\n updatedGame = {\n ...game,\n lords: updatedLord,\n nextAction: resultStep,\n };\n } else {\n updatedGame = {\n ...game,\n lords: updatedLord,\n nextAction: <NextAction>nextLordWithAction(updatedLord),\n };\n }\n\n return ok(updatedGame);\n};\n","import { getAvailablesExtraRules } from \"@core/domain/entities/rule.js\";\nimport type { GameMode } from \"@core/domain/types/mode.js\";\nimport type { ExtraRule } from \"@core/domain/types/rule.js\";\nimport type { RuleRepository } from \"@core/portServerside/ruleRepository.js\";\nimport { err, type Result } from \"@utils/result.js\";\n\nexport type GetExtraRulesUseCase = (\n mode: GameMode[\"name\"],\n players: number\n) => Result<ExtraRule[]>;\n\nexport const getExtraRulesUseCase =\n (deps: { ruleRepository: RuleRepository }): GetExtraRulesUseCase =>\n (mode: GameMode[\"name\"], players: number): Result<ExtraRule[]> => {\n const { ruleRepository } = deps;\n\n const allExtraRules = ruleRepository.getAllExtra();\n\n if (!allExtraRules) {\n return err(\"No rules found\");\n }\n\n return getAvailablesExtraRules(allExtraRules, mode, players);\n };\n","import type { GameMode } from \"@core/domain/types/mode.js\";\nimport type { ModeRepository } from \"@core/portServerside/modeRepository.js\";\nimport { ok, type Result } from \"@utils/result.js\";\n\nexport type GetModesUseCase = () => Result<GameMode[]>;\n\nexport const getModesUseCase =\n (deps: { modeRepository: ModeRepository }): GetModesUseCase =>\n (): Result<GameMode[]> => {\n const { modeRepository } = deps;\n return ok(modeRepository.getAvailables());\n };\n","import {\n checkCastleIsInMiddle,\n countDominoes,\n} from \"@core/domain/entities/kingdom.js\";\nimport type {\n FinalResult,\n GameWithNextStep,\n GameWithResults,\n ScoreResult,\n} from \"@core/domain/types/index.js\";\nimport { ok, type Result } from \"@utils/result.js\";\n\nexport type GetResultUseCase = (\n game: GameWithNextStep,\n scoreResult: ScoreResult[]\n) => Result<GameWithResults>;\n\nexport const getResultUseCase: GetResultUseCase = (game, scoreResult) => {\n const { rules } = game;\n const { basic, extra } = rules;\n\n const finalScoreResult = scoreResult.map((score): ScoreResult => {\n let finalScore = score.details.points;\n\n const kingdom = game.players.find((player) => {\n if (player.id === score.playerId) {\n return player;\n }\n })?.kingdom!;\n\n if (extra.length > 0) {\n extra.forEach((extraRule) => {\n if (extraRule.name === \"The middle Kingdom\") {\n const castleIsInMiddle = checkCastleIsInMiddle(kingdom);\n if (castleIsInMiddle) {\n finalScore += 10;\n }\n }\n\n if (extraRule.name === \"Harmony\") {\n const totalDominoes = countDominoes(kingdom);\n const dominoLimit = basic.maxDominoes;\n const totalPlayers = game.players.length;\n const dominoesPerPlayer = dominoLimit / totalPlayers;\n if (totalDominoes === dominoesPerPlayer) {\n finalScore += 5;\n }\n }\n });\n }\n\n return {\n ...score,\n details: {\n ...score.details,\n points: finalScore,\n },\n };\n });\n\n // 1 order players by score, then by maxPropertiesSize, then by totalCrowns all descending\n finalScoreResult.sort((a, b) => {\n if (a.details.points !== b.details.points) {\n return b.details.points - a.details.points;\n }\n if (a.details.maxPropertiesSize !== b.details.maxPropertiesSize) {\n return b.details.maxPropertiesSize - a.details.maxPropertiesSize;\n }\n return b.details.totalCrowns - a.details.totalCrowns;\n });\n\n const result: FinalResult[] = [];\n\n let isTie = false;\n result.push({\n playerId: finalScoreResult[0]!.playerId,\n playerName: finalScoreResult[0]!.playerName,\n details: finalScoreResult[0]!.details,\n position: 1,\n });\n\n for (let i = 1; i < finalScoreResult.length; i++) {\n const currentScore = finalScoreResult[i];\n const previousScore = finalScoreResult[i - 1];\n if (\n previousScore &&\n currentScore &&\n currentScore.details.points === previousScore.details.points &&\n currentScore.details.maxPropertiesSize ===\n previousScore.details.maxPropertiesSize &&\n currentScore.details.totalCrowns === previousScore.details.totalCrowns\n ) {\n isTie = true;\n }\n\n if (isTie) {\n result.push({\n ...currentScore!,\n position: result[i - 1]!.position,\n });\n } else {\n result.push({\n ...currentScore!,\n position: i + 1,\n });\n }\n\n isTie = false;\n }\n\n return ok({\n ...game,\n result: result,\n });\n};\n","import { err, isErr, ok } from \"@utils/result.js\";\nimport {\n gameSteps,\n type GameState,\n type GameStateResult,\n type GameWithNextAction,\n type NextAction,\n type NextStep,\n} from \"@core/domain/types/game.js\";\nimport {\n allLordsHavePlayed,\n canPlaceAndDominoPickedIsDefined,\n nextLordWithAction,\n} from \"@core/domain/entities/lord.js\";\nimport { placeDomino } from \"@core/domain/entities/kingdom.js\";\nimport type {\n Orientation,\n Position,\n Rotation,\n} from \"@core/domain/types/kingdom.js\";\n\nexport type PlaceDominoUseCase = (\n game: GameWithNextAction,\n lordId: string,\n position: Position,\n orientation: Orientation,\n rotation: Rotation\n) => GameStateResult;\n\nexport const placeDominoUseCase: PlaceDominoUseCase = (\n game,\n lordId,\n position,\n orientation,\n rotation\n) => {\n const nextAction = game.nextAction;\n\n const currentLord = game.lords.find(\n (lord) => lord.id === nextAction.nextLord\n );\n\n if (!currentLord) {\n return err(\"Lord not found\");\n }\n\n if (currentLord.id !== lordId) {\n return err(\"Not your turn\");\n }\n\n if (!canPlaceAndDominoPickedIsDefined(currentLord)) {\n return err(\"Lord can't place\");\n }\n\n const domino = currentLord.dominoPicked;\n\n const currentPlayer = game.players.find(\n (player) => player.id === currentLord.playerId\n );\n\n if (!currentPlayer) {\n return err(\"Player not found\");\n }\n\n const updatedKingdom = placeDomino(\n currentPlayer.kingdom,\n position,\n orientation,\n rotation,\n domino\n );\n\n if (isErr(updatedKingdom)) {\n return updatedKingdom;\n }\n\n const updatedPlayers = game.players.map((player) => {\n if (player.id === currentPlayer.id) {\n player.kingdom = updatedKingdom.value;\n }\n return player;\n });\n\n const maxTurns = game.rules.basic.maxTurns;\n const currentTurn = game.turn;\n const isLastTurn = currentTurn === maxTurns;\n\n const updatedLords = game.lords.map((lord) => {\n if (lord.id === currentLord.id) {\n if (isLastTurn) {\n return {\n ...lord,\n turnEnded: true,\n hasPlace: true,\n };\n }\n return {\n ...lord,\n hasPlace: true,\n };\n }\n return lord;\n });\n\n let updatedGame: GameState;\n\n const resultStep: NextStep = {\n type: \"step\",\n step: gameSteps.result,\n };\n\n if (isLastTurn && allLordsHavePlayed(updatedLords)) {\n updatedGame = {\n ...game,\n lords: updatedLords,\n nextAction: resultStep,\n players: updatedPlayers,\n };\n } else {\n updatedGame = {\n ...game,\n lords: updatedLords,\n nextAction: <NextAction>nextLordWithAction(updatedLords),\n players: updatedPlayers,\n };\n }\n\n return ok(updatedGame);\n};\n","import { createLord } from \"@core/domain/entities/lord\";\nimport type {\n GameWithNextAction,\n GameWithNextStep,\n NextAction,\n} from \"@core/domain/types/game.js\";\nimport type { Lord } from \"@core/domain/types/lord.js\";\nimport { playerActions } from \"@core/domain/types/player.js\";\nimport type { ShuffleMethod } from \"@core/portServerside/shuffleMethod.js\";\nimport type { UuidMethod } from \"@core/portServerside/uuidMethod.js\";\nimport { ok, type Result } from \"@utils/result.js\";\n\nexport type StartGameUseCase = (\n game: GameWithNextStep\n) => Result<GameWithNextAction>;\n\nexport const startGameUseCase =\n (deps: {\n uuidMethod: UuidMethod;\n shuffleMethod: ShuffleMethod;\n }): StartGameUseCase =>\n (game) => {\n const { uuidMethod, shuffleMethod } = deps;\n const {\n rules: {\n basic: { lords: maxLords, dominoesPerTurn },\n },\n players,\n dominoes,\n } = game;\n\n const numberOfPlayers = players.length;\n\n const newLords: Lord[] = [];\n\n for (let i = 0; i < numberOfPlayers; i++) {\n for (let j = 0; j < maxLords; j++) {\n const lord = createLord(uuidMethod(), players[i]!.id);\n newLords.push(lord);\n }\n }\n\n const shuffledLords = shuffleMethod(newLords);\n const dominoesCopy = [...dominoes];\n const dominoesDrawn = dominoesCopy.splice(0, dominoesPerTurn);\n dominoesDrawn.sort((a, b) => a.number - b.number);\n const nextAction: NextAction = {\n type: \"action\",\n nextLord: shuffledLords[0]!.id,\n nextAction: playerActions.pickDomino,\n };\n\n const newState: GameWithNextAction = {\n ...game,\n lords: shuffledLords,\n nextAction,\n dominoes: dominoesCopy,\n currentDominoes: dominoesDrawn.map((domino, index) => {\n return {\n domino,\n picked: false,\n lordId: null,\n position: index + 1,\n };\n }),\n };\n\n return ok(newState);\n };\n","import type { Kingdom, Score } from \"@core/domain/types/index.js\";\nimport { ok, type Result } from \"@utils/result.js\";\n\nexport type CalculateScoreUseCase = (kingdom: Kingdom) => Result<Score>;\n\ntype Property = {\n type: string;\n crowns: number;\n size: number;\n tiles: number[][];\n};\n\nexport const calculateScoreUseCase: CalculateScoreUseCase = (kingdom) => {\n const visited: boolean[][] = kingdom.map((row) => row.map(() => false));\n const properties: Property[] = [];\n\n const directions = [\n [-1, 0],\n [1, 0],\n [0, -1],\n [0, 1],\n ]; // Up, Down, Left, Right\n\n const markZone = (\n x: number,\n y: number,\n type: string,\n crowns: number\n ): void => {\n if (\n x < 0 ||\n y < 0 ||\n x >= kingdom[0]!.length ||\n y >= kingdom.length ||\n visited[y]![x] ||\n kingdom[y]![x]!.type !== type ||\n kingdom[y]![x]!.type === \"empty\" ||\n kingdom[y]![x]!.type === \"castle\"\n ) {\n return;\n }\n\n visited[y]![x] = true;\n const currentZone = properties.find(\n (property) =>\n property.type === type &&\n property.tiles.some(([tx, ty]) => {\n for (let [dx, dy] of directions) {\n if (\n (tx as number) + (dx as number) === x &&\n (ty as number) + (dy as number) === y\n ) {\n return true;\n }\n }\n return false;\n })\n );\n\n if (currentZone) {\n currentZone.size += 1;\n currentZone.tiles.push([x, y]);\n currentZone.crowns += crowns;\n } else {\n properties.push({\n type,\n crowns,\n size: 1,\n tiles: [[x, y]],\n });\n }\n\n directions.forEach(([dx, dy]) => {\n const nx = x + (dx as number);\n const ny = y + (dy as number);\n if (\n nx >= 0 &&\n ny >= 0 &&\n nx < kingdom[0]!.length &&\n ny < kingdom.length &&\n kingdom[ny]![nx]!.type === type\n ) {\n markZone(nx, ny, kingdom[ny]![nx]!.type, kingdom[ny]![nx]!.crowns);\n }\n });\n };\n\n kingdom.forEach((row, y) => {\n row.forEach((tile, x) => {\n if (!visited[y]![x]) {\n markZone(x, y, tile.type, tile.crowns);\n }\n });\n });\n\n if (properties.length === 0) {\n return ok({\n points: 0,\n maxPropertiesSize: 0,\n totalCrowns: 0,\n });\n }\n\n let points = properties.reduce((acc, property) => {\n return acc + property.size * property.crowns;\n }, 0);\n\n const maxPropertiesSize = Math.max(\n ...properties.map((property) => property.size)\n );\n const totalCrowns = properties.reduce(\n (acc, property) => acc + property.crowns,\n 0\n );\n\n return ok({\n points,\n maxPropertiesSize,\n totalCrowns,\n });\n};\n","import jsonDominoes from \"@adapter/jsonDominoes.js\";\nimport jsonModes from \"@adapter/jsonModes.js\";\nimport jsonRules from \"@adapter/jsonRules.js\";\nimport { shuffleMethod } from \"@adapter/shuffle.js\";\nimport { uuidMethod } from \"@adapter/uuid.js\";\nimport { winstonLogger } from \"@adapter/winstonLogger.js\";\nimport { addExtraRulesHandler } from \"@application/handlers/addExtraRulesHandler.js\";\nimport { addPlayersHandler } from \"@application/handlers/addPlayersHandler.js\";\nimport { chooseDominoHandler } from \"@application/handlers/chooseDominoHandler.js\";\nimport { createGameHandler } from \"@application/handlers/createGameHandler.js\";\nimport { discardDominoHandler } from \"@application/handlers/discardDominoHandler.js\";\nimport { getExtraRulesHandler } from \"@application/handlers/getExtraRulesHandler.js\";\nimport { getModesHandler } from \"@application/handlers/getModesHandler.js\";\nimport { getResultHandler } from \"@application/handlers/getResultHandler.js\";\nimport { placeDominoHandler } from \"@application/handlers/placeDominoHandler.js\";\nimport { startGameHandler } from \"@application/handlers/startGameHandler.js\";\nimport { calculateScoreHandler } from \"@application/handlers/calculateScoreHandler.js\";\nimport type { ShuffleMethod } from \"@core/portServerside/shuffleMethod.js\";\nimport type { UuidMethod } from \"@core/portServerside/uuidMethod.js\";\nimport { addExtraRulesUseCase } from \"@core/useCases/addExtraRules.js\";\nimport { addPlayersUseCase } from \"@core/useCases/addPlayers.js\";\nimport { chooseDominoUseCase } from \"@core/useCases/chooseDomino.js\";\nimport { createGameUseCase } from \"@core/useCases/createGame.js\";\nimport { discardDominoUseCase } from \"@core/useCases/discardDomino.js\";\nimport { getExtraRulesUseCase } from \"@core/useCases/getExtraRules.js\";\nimport { getModesUseCase } from \"@core/useCases/getModes.js\";\nimport { getResultUseCase } from \"@core/useCases/getResult.js\";\nimport { placeDominoUseCase } from \"@core/useCases/placeDomino.js\";\nimport { startGameUseCase } from \"@core/useCases/startGame.js\";\nimport { calculateScoreUseCase } from \"@core/useCases/calculateScore.js\";\n\nexport type EngineConfig = {\n uuidMethod?: UuidMethod;\n shuffleMethod?: ShuffleMethod;\n logging?: boolean;\n};\n\nexport const configureEngine = (config: Partial<EngineConfig>) => {\n const modeRepository = jsonModes();\n const dominoesRepository = jsonDominoes();\n const ruleRepository = jsonRules();\n const uuid = config.uuidMethod || uuidMethod;\n const shuffle = config.shuffleMethod || shuffleMethod;\n const logger = config.logging ? winstonLogger(true) : winstonLogger(false);\n\n return {\n createGameHandler: createGameHandler(\n logger,\n createGameUseCase({\n modeRepository,\n dominoesRepository,\n uuidMethod: uuid,\n })\n ),\n getModesHandler: getModesHandler(\n logger,\n getModesUseCase({ modeRepository })\n ),\n getExtraRulesHandler: getExtraRulesHandler(\n logger,\n getExtraRulesUseCase({ ruleRepository })\n ),\n addPlayersHandler: addPlayersHandler(\n logger,\n addPlayersUseCase({\n uuidMethod: uuid,\n shuffleMethod: shuffle,\n ruleRepository,\n })\n ),\n addExtraRulesHandler: addExtraRulesHandler(\n logger,\n addExtraRulesUseCase({ ruleRepository })\n ),\n startGameHandler: startGameHandler(\n logger,\n startGameUseCase({ uuidMethod: uuid, shuffleMethod: shuffle })\n ),\n chooseDominoHandler: chooseDominoHandler(logger, chooseDominoUseCase),\n placeDominoHandler: placeDominoHandler(logger, placeDominoUseCase),\n discardDominoHandler: discardDominoHandler(logger, discardDominoUseCase),\n getResultHandler: getResultHandler(logger, {\n getResultUseCase,\n calculateScoreUseCase,\n }),\n calculateScoreHandler: calculateScoreHandler(logger, calculateScoreUseCase),\n };\n};\n","import type { GameEngine } from \"./core/portUserside/engine.js\";\nimport { configureEngine, type EngineConfig } from \"./config.js\";\n\nexport const createGameEngine = (config: Partial<EngineConfig>): GameEngine => {\n const {\n createGameHandler,\n getModesHandler,\n getExtraRulesHandler,\n addPlayersHandler,\n addExtraRulesHandler,\n startGameHandler,\n chooseDominoHandler,\n placeDominoHandler,\n discardDominoHandler,\n getResultHandler,\n calculateScoreHandler,\n } = configureEngine(config);\n\n return {\n getModes: (command) => getModesHandler(command),\n getExtraRules: (command) => getExtraRulesHandler(command),\n createGame: (command) => createGameHandler(command),\n addPlayers: (command) => addPlayersHandler(command),\n addExtraRules: (command) => addExtraRulesHandler(command),\n startGame: (command) => startGameHandler(command),\n chooseDomino: (command) => chooseDominoHandler(command),\n placeDomino: (command) => placeDominoHandler(command),\n discardDomino: (command) => discardDominoHandler(command),\n getResults: (command) => getResultHandler(command),\n calculateScore: (command) => calculateScoreHandler(command),\n };\n};\n"],"mappings":";AAAA;AAAA,EACE,SAAW;AAAA,IACT;AAAA,MACE,MAAQ;AAAA,QACN,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,OAAS;AAAA,QACP,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,QAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,QACN,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,OAAS;AAAA,QACP,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,QAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,QACN,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,OAAS;AAAA,QACP,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,QAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,QACN,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,OAAS;AAAA,QACP,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,QAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,QACN,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,OAAS;AAAA,QACP,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,QAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,QACN,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,OAAS;AAAA,QACP,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,QAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,QACN,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,OAAS;AAAA,QACP,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,QAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,QACN,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,OAAS;AAAA,QACP,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,QAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,QACN,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,OAAS;AAAA,QACP,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,QAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,QACN,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,OAAS;AAAA,QACP,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,QAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,QACN,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,OAAS;AAAA,QACP,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,QAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,QACN,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,OAAS;AAAA,QACP,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,QAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,QACN,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,OAAS;AAAA,QACP,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,QAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,QACN,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,OAAS;AAAA,QACP,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,QAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,QACN,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,OAAS;AAAA,QACP,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,QAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,QACN,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,OAAS;AAAA,QACP,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,QAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,QACN,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,OAAS;AAAA,QACP,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,QAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,QACN,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,OAAS;AAAA,QACP,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,QAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,QACN,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,OAAS;AAAA,QACP,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,QAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,QACN,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,OAAS;AAAA,QACP,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,QAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,QACN,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,OAAS;AAAA,QACP,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,QAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,QACN,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,OAAS;AAAA,QACP,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,QAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,QACN,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,OAAS;AAAA,QACP,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,QAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,QACN,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,OAAS;AAAA,QACP,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,QAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,QACN,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,OAAS;AAAA,QACP,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,QAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,QACN,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,OAAS;AAAA,QACP,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,QAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,QACN,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,OAAS;AAAA,QACP,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,QAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,QACN,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,OAAS;AAAA,QACP,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,QAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,QACN,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,OAAS;AAAA,QACP,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,QAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,QACN,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,OAAS;AAAA,QACP,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,QAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,QACN,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,OAAS;AAAA,QACP,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,QAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,QACN,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,OAAS;AAAA,QACP,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,QAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,QACN,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,OAAS;AAAA,QACP,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,QAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,QACN,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,OAAS;AAAA,QACP,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,QAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,QACN,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,OAAS;AAAA,QACP,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,QAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,QACN,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,OAAS;AAAA,QACP,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,QAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,QACN,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,OAAS;AAAA,QACP,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,QAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,QACN,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,OAAS;AAAA,QACP,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,QAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,QACN,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,OAAS;AAAA,QACP,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,QAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,QACN,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,OAAS;AAAA,QACP,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,QAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,QACN,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,OAAS;AAAA,QACP,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,QAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,QACN,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,OAAS;AAAA,QACP,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,QAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,QACN,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,OAAS;AAAA,QACP,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,QAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,QACN,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,OAAS;AAAA,QACP,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,QAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,QACN,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,OAAS;AAAA,QACP,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,QAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,QACN,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,OAAS;AAAA,QACP,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,QAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,QACN,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,OAAS;AAAA,QACP,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,QAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,QACN,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,OAAS;AAAA,QACP,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,QAAU;AAAA,IACZ;AAAA,EACF;AACF;;;AC9gBA,IAAM,eAAe,MAA0B;AAC7C,QAAM,WAAqC,CAAC;AAE5C,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,gBAAY,GAAG;AACvD,UAAM,kBAA4B,CAAC;AACnC,UAAM,QAAQ,CAAC,WAAW;AACxB,sBAAgB,KAAK;AAAA,QACnB,MAAM;AAAA,UACJ,MAAc,OAAO,KAAK;AAAA,UAC1B,QAAQ,OAAO,KAAK;AAAA,QACtB;AAAA,QACA,OAAO;AAAA,UACL,MAAc,OAAO,MAAM;AAAA,UAC3B,QAAQ,OAAO,MAAM;AAAA,QACvB;AAAA,QACA,QAAQ,OAAO;AAAA,MACjB,CAAC;AAAA,IACH,CAAC;AAED,aAAS,GAAG,IAAI;AAAA,EAClB;AAEA,SAAO;AAAA,IACL,YAAY,CAAC,SAAmB;AAC9B,aAAO,SAAS,KAAK,IAAI,KAAK,CAAC;AAAA,IACjC;AAAA,EACF;AACF;AAEA,IAAO,uBAAQ;;;AClCf;AAAA,EACI;AAAA,IACI,MAAQ;AAAA,IACR,aAAe;AAAA,EACnB;AACJ;;;ACDA,IAAM,YAAY,MAAsB;AACtC,QAAM,QAAoB,CAAC;AAE3B,gBAAU,QAAQ,CAAC,SAAS;AAC1B,UAAM,KAAK;AAAA,MACT,MAAM,KAAK;AAAA,MACX,aAAa,KAAK;AAAA,IACpB,CAAC;AAAA,EACH,CAAC;AAED,SAAO;AAAA,IACL,eAAe,MAAM;AACnB,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAEA,IAAO,oBAAQ;;;ACrBf;AAAA,EACE,QAAU;AAAA,IACR;AAAA,MACE,cAAgB;AAAA,MAChB,gBAAkB;AAAA,MAClB,aAAe;AAAA,MACf,iBAAmB;AAAA,MACnB,UAAY;AAAA,IACd;AAAA,IACA;AAAA,MACE,cAAgB;AAAA,MAChB,gBAAkB;AAAA,MAClB,aAAe;AAAA,MACf,iBAAmB;AAAA,MACnB,UAAY;AAAA,IACd;AAAA,IACA;AAAA,MACE,cAAgB;AAAA,MAChB,gBAAkB;AAAA,MAClB,aAAe;AAAA,MACf,iBAAmB;AAAA,MACnB,UAAY;AAAA,IACd;AAAA,EACF;AAAA,EACA,OAAS;AAAA,IACP;AAAA,MACE,MAAQ;AAAA,MACR,aAAe;AAAA,MACf,MAAQ,CAAC,EAAE,MAAQ,WAAW,aAAe,2BAA2B,CAAC;AAAA,IAC3E;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,aAAe;AAAA,MACf,MAAQ,CAAC,EAAE,MAAQ,WAAW,aAAe,2BAA2B,CAAC;AAAA,IAC3E;AAAA,EACF;AACF;;;AChCA,IAAM,YAAY,MAAsB;AACtC,QAAM,QAAe;AAAA,IACnB,OAAO,CAAC;AAAA,IACR,YAAY,CAAC;AAAA,EACf;AAEA,QAAM,cAAc,cAAU;AAC9B,QAAM,aAAa,cAAU;AAE7B,cAAY,QAAQ,CAAC,SAAS;AAC5B,UAAM,MAAM,KAAK,YAAY,IAAI;AAAA,MAC/B,OAAO,KAAK;AAAA,MACZ,aAAa,KAAK;AAAA,MAClB,iBAAiB,KAAK;AAAA,MACtB,UAAU,KAAK;AAAA,IACjB;AAAA,EACF,CAAC;AAED,aAAW,QAAQ,CAAC,SAAS;AAC3B,UAAM,WAAW,KAAK;AAAA,MACpB,MAAM,KAAK;AAAA,MACX,aAAa,KAAK;AAAA,MAClB,MAAM,KAAK;AAAA,IACb,CAAC;AAAA,EACH,CAAC;AAED,SAAO;AAAA,IACL,QAAQ,MAAM;AACZ,aAAO;AAAA,IACT;AAAA,IACA,aAAa,MAAM;AACjB,aAAO,MAAM;AAAA,IACf;AAAA,EACF;AACF;AAEA,IAAO,oBAAQ;;;ACtCR,IAAM,gBAA+B,CAAI,UAAe;AAC7D,WAAS,IAAI,MAAM,SAAS,GAAG,IAAI,GAAG,KAAK;AACzC,UAAM,IAAI,KAAK,MAAM,KAAK,OAAO,KAAK,IAAI,EAAE;AAC5C,KAAC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAQ,MAAM,CAAC,CAAM;AAAA,EACtD;AACA,SAAO;AACT;;;ACPA,SAAS,kBAAkB;AAEpB,IAAM,aAAyB,MAAM;AAC1C,SAAO,WAAW;AACpB;;;ACJA,OAAO,aAAa;AAEb,IAAM,gBAAgB,CAAC,qBAAsC;AAClE,QAAM,WAAW,QAAQ,OAAO;AAAA,IAC9B,CAAC,EAAE,OAAO,SAAS,OAAO,UAAU,MAAM;AACxC,aAAO,GAAG,SAAS,KAAK,KAAK,KAAK,KAAK,KAAK,OAAO;AAAA,IACrD;AAAA,EACF;AAEA,QAAM,SAAS,QAAQ,aAAa;AAAA,IAClC,OAAO;AAAA,IACP,QAAQ,QAAQ,OAAO;AAAA,MACrB,QAAQ,OAAO,MAAM,EAAE,OAAO,iBAAiB,CAAC;AAAA,MAChD,QAAQ,OAAO,UAAU;AAAA,MACzB,QAAQ,OAAO,OAAO;AAAA,MACtB,QAAQ,OAAO,KAAK;AAAA,MACpB,QAAQ,OAAO,SAAS;AAAA,MACxB;AAAA,IACF;AAAA,IACA,YAAY,CAAC,IAAI,QAAQ,WAAW,QAAQ,CAAC;AAAA,EAC/C,CAAC;AAED,SAAO;AAAA,IACL,MAAM,CAAC,YAAoB;AACzB,UAAI,kBAAkB;AACpB,eAAO,KAAK,OAAO;AAAA,MACrB;AACA,aAAO;AAAA,IACT;AAAA,IACA,OAAO,CAAC,YAAoB;AAC1B,UAAI,kBAAkB;AACpB,eAAO,MAAM,OAAO;AAAA,MACtB;AACA,aAAO;AAAA,IACT;AAAA,EACF;AACF;;;ACrCO,IAAM,mBAAN,cAA+B,MAAM;AAAA,EAC1C,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,qBAAN,cAAiC,MAAM;AAAA,EAC5C,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,uBAAN,cAAmC,MAAM;AAAA,EAC9C,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,gBAAN,cAA4B,MAAM;AAAA,EACvC,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;;;ACNO,IAAM,YAAY;AAAA,EACvB,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,OAAO;AAAA,EACP,QAAQ;AACV;AAoBO,IAAM,uBAAuB,CAClC,SAC+B;AAC/B,SAAO,KAAK,WAAW,SAAS;AAClC;AAEO,IAAM,qBAAqB,CAChC,SAC6B;AAC7B,SAAO,KAAK,WAAW,SAAS;AAClC;;;AC3CO,IAAM,KAAK,CAAI,WAAqB,EAAE,KAAK,MAAM,MAAM;AACvD,IAAM,MAAM,CAAC,WAAwB,EAAE,KAAK,OAAO,MAAM;AAEzD,IAAM,OAAO,CAAI,WACtB,OAAO,QAAQ;AACV,IAAM,QAAQ,CAAI,WACvB,OAAO,QAAQ;;;ACHV,IAAM,uBACX,CAAC,QAAgB,YACjB,CAAC,YAAkC;AACjC,QAAM,EAAE,MAAM,WAAW,IAAI;AAC7B,SAAO,KAAK,+BAA+B,KAAK,EAAE,EAAE;AACpD,SAAO,KAAK,gBAAgB,UAAU,EAAE;AAExC,MAAI,CAAC,mBAAmB,IAAI,GAAG;AAC7B,WAAO;AAAA,MACL,2DAA2D,KAAK,WAAW,IAAI;AAAA,IACjF;AACA,UAAM,IAAI,iBAAiB,4CAA4C;AAAA,EACzE;AAEA,MAAI,KAAK,WAAW,SAAS,WAAW;AACtC,WAAO;AAAA,MACL,4CAA4C,KAAK,WAAW,IAAI;AAAA,IAClE;AACA,UAAM,IAAI,iBAAiB,iCAAiC;AAAA,EAC9D;AAEA,QAAM,SAAS,QAAQ,MAAM,UAAU;AAEvC,MAAI,MAAM,MAAM,GAAG;AACjB,WAAO,MAAM,6BAA6B,OAAO,KAAK,EAAE;AACxD,UAAM,IAAI,mBAAmB,OAAO,KAAK;AAAA,EAC3C;AAEA,SAAO,KAAK,8BAA8B,KAAK,EAAE,EAAE;AACnD,SAAO,OAAO;AAChB;;;AC9BK,IAAM,oBACX,CAAC,QAAgB,YACjB,CAAC,YAA+B;AAC9B,QAAM,EAAE,MAAM,QAAQ,IAAI;AAE1B,SAAO,KAAK,2BAA2B,KAAK,EAAE,EAAE;AAEhD,MAAI,CAAC,mBAAmB,IAAI,GAAG;AAC7B,WAAO;AAAA,MACL,2DAA2D,KAAK,WAAW,IAAI;AAAA,IACjF;AACA,UAAM,IAAI,iBAAiB,4CAA4C;AAAA,EACzE;AAEA,MAAI,KAAK,WAAW,SAAS,cAAc;AACzC,WAAO;AAAA,MACL,+CAA+C,KAAK,WAAW,IAAI;AAAA,IACrE;AACA,UAAM,IAAI,iBAAiB,oCAAoC;AAAA,EACjE;AAEA,QAAM,SAAS,QAAQ,MAAM,OAAO;AAEpC,MAAI,MAAM,MAAM,GAAG;AACjB,WAAO,MAAM,yBAAyB,OAAO,KAAK,EAAE;AACpD,UAAM,IAAI,mBAAmB,OAAO,KAAK;AAAA,EAC3C;AAEA,SAAO,KAAK,0BAA0B,KAAK,EAAE,EAAE;AAC/C,SAAO,OAAO;AAChB;;;AC9BK,IAAM,sBACX,CAAC,QAAgB,YACjB,CAAC,YAAiC;AAChC,QAAM,EAAE,MAAM,QAAQ,WAAW,IAAI;AACrC,SAAO;AAAA,IACL,oBAAoB,UAAU,cAAc,MAAM,aAAa,KAAK,EAAE;AAAA,EACxE;AAEA,MAAI,CAAC,qBAAqB,IAAI,GAAG;AAC/B,WAAO;AAAA,MACL,6DAA6D,KAAK,WAAW,IAAI;AAAA,IACnF;AACA,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,MAAI,KAAK,WAAW,eAAe,cAAc;AAC/C,WAAO;AAAA,MACL,iDAAiD,KAAK,WAAW,UAAU;AAAA,IAC7E;AACA,UAAM,IAAI,iBAAiB,sCAAsC;AAAA,EACnE;AAEA,QAAM,SAAS,QAAQ,MAAM,QAAQ,UAAU;AAE/C,MAAI,MAAM,MAAM,GAAG;AACjB,WAAO,MAAM,0BAA0B,OAAO,KAAK,EAAE;AACrD,UAAM,IAAI,qBAAqB,OAAO,KAAK;AAAA,EAC7C;AAEA,SAAO;AAAA,IACL,kBAAkB,UAAU,cAAc,MAAM,aAAa,KAAK,EAAE;AAAA,EACtE;AACA,SAAO,OAAO;AAChB;;;ACzCK,IAAM,oBACX,CAAC,QAAgB,YACjB,CAAC,YAA+B;AAC9B,SAAO,KAAK,4BAA4B,QAAQ,IAAI,EAAE;AACtD,QAAM,SAAS,QAAQ,QAAQ,IAAI;AAEnC,MAAI,MAAM,MAAM,GAAG;AACjB,WAAO,MAAM,wBAAwB,OAAO,KAAK,EAAE;AACnD,UAAM,IAAI,mBAAmB,OAAO,KAAK;AAAA,EAC3C;AAEA,SAAO,KAAK,iBAAiB,OAAO,MAAM,EAAE,EAAE;AAC9C,SAAO,OAAO;AAChB;;;ACPK,IAAM,uBACX,CAAC,QAAgB,YACjB,CAAC,YAAkC;AACjC,QAAM,EAAE,MAAM,OAAO,IAAI;AACzB,SAAO,KAAK,+BAA+B,MAAM,aAAa,KAAK,EAAE,EAAE;AAEvE,MAAI,CAAC,qBAAqB,IAAI,GAAG;AAC/B,WAAO;AAAA,MACL,6DAA6D,KAAK,WAAW,IAAI;AAAA,IACnF;AACA,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,MAAI,KAAK,WAAW,eAAe,eAAe;AAChD,WAAO;AAAA,MACL,kDAAkD,KAAK,WAAW,UAAU;AAAA,IAC9E;AACA,UAAM,IAAI,iBAAiB,uCAAuC;AAAA,EACpE;AAEA,QAAM,SAAS,QAAQ,MAAM,MAAM;AAEnC,MAAI,MAAM,MAAM,GAAG;AACjB,WAAO,MAAM,4BAA4B,OAAO,KAAK,EAAE;AACvD,UAAM,IAAI,qBAAqB,OAAO,KAAK;AAAA,EAC7C;AAEA,MAAI,qBAAqB,OAAO,KAAK,GAAG;AACtC,WAAO,KAAK,qBAAqB,MAAM,aAAa,KAAK,EAAE,EAAE;AAC7D,WAAO,OAAO;AAAA,EAChB;AAEA,SAAO,KAAK,qBAAqB,MAAM,aAAa,KAAK,EAAE,EAAE;AAC7D,SAAO,OAAO;AAChB;;;AC1CK,IAAM,uBACX,CAAC,QAAgB,YACjB,CAAC,YAAkC;AACjC,QAAM,EAAE,MAAM,QAAQ,IAAI;AAC1B,SAAO;AAAA,IACL,iCAAiC,IAAI,iBAAiB,OAAO;AAAA,EAC/D;AACA,QAAM,SAAS,QAAQ,MAAM,OAAO;AAEpC,MAAI,MAAM,MAAM,GAAG;AACjB,WAAO,MAAM,8BAA8B,OAAO,KAAK,EAAE;AACzD,UAAM,IAAI,cAAc,OAAO,KAAK;AAAA,EACtC;AAEA,SAAO,KAAK,0BAA0B,OAAO,KAAK,EAAE;AACpD,SAAO,OAAO;AAChB;;;AChBK,IAAM,kBACX,CAAC,QAAgB,YACjB,CAAC,aAA8B;AAC7B,SAAO,KAAK,eAAe;AAC3B,QAAM,SAAS,QAAQ;AAEvB,MAAI,MAAM,MAAM,GAAG;AACjB,WAAO,MAAM,wBAAwB,OAAO,KAAK,EAAE;AACnD,UAAM,IAAI,cAAc,OAAO,KAAK;AAAA,EACtC;AAEA,SAAO,KAAK,oBAAoB,OAAO,KAAK,EAAE;AAC9C,SAAO,OAAO;AAChB;;;ACJK,IAAM,mBACX,CACE,QACA,aAKF,CAAC,YAA8B;AAC7B,QAAM,EAAE,kBAAAA,mBAAkB,uBAAAC,uBAAsB,IAAI;AACpD,QAAM,EAAE,KAAK,IAAI;AACjB,SAAO,KAAK,4BAA4B,KAAK,EAAE,EAAE;AAEjD,MAAI,CAAC,mBAAmB,IAAI,GAAG;AAC7B,WAAO;AAAA,MACL,2DAA2D,KAAK,WAAW,IAAI;AAAA,IACjF;AACA,UAAM,IAAI,iBAAiB,4CAA4C;AAAA,EACzE;AAEA,MAAI,KAAK,WAAW,SAAS,UAAU;AACrC,WAAO;AAAA,MACL,2CAA2C,KAAK,WAAW,IAAI;AAAA,IACjE;AACA,UAAM,IAAI,iBAAiB,gCAAgC;AAAA,EAC7D;AAEA,MAAI;AACJ,QAAM,EAAE,QAAQ,IAAI;AAEpB,gBAAc,QAAQ,IAAI,CAAC,WAAW;AACpC,UAAM,EAAE,QAAQ,IAAI;AACpB,UAAMC,UAASD,uBAAsB,OAAO;AAE5C,QAAI,MAAMC,OAAM,GAAG;AACjB,aAAO,MAAM,iCAAiCA,QAAO,KAAK,EAAE;AAC5D,YAAM,IAAI,mBAAmBA,QAAO,KAAK;AAAA,IAC3C;AAEA,WAAO;AAAA,MACL,UAAU,OAAO;AAAA,MACjB,YAAY,OAAO;AAAA,MACnB,SAAS;AAAA,QACP,GAAGA,QAAO;AAAA,MACZ;AAAA,IACF;AAAA,EACF,CAAC;AAED,QAAM,SAASF,kBAAiB,MAAM,WAAW;AAEjD,MAAI,MAAM,MAAM,GAAG;AACjB,WAAO,MAAM,yBAAyB,OAAO,KAAK,EAAE;AACpD,UAAM,IAAI,cAAc,OAAO,KAAK;AAAA,EACtC;AAEA,SAAO,KAAK,8BAA8B,KAAK,EAAE,EAAE;AACnD,SAAO,OAAO;AAChB;;;AC5DK,IAAM,qBACX,CAAC,QAAgB,YACjB,CAAC,YAAgC;AAC/B,QAAM,EAAE,MAAM,QAAQ,UAAU,aAAa,SAAS,IAAI;AAC1D,SAAO;AAAA,IACL,mBAAmB,MAAM,iBAAiB,KAAK;AAAA,MAC7C;AAAA,IACF,CAAC,sBAAsB,WAAW,kBAAkB,QAAQ,aAC1D,KAAK,EACP;AAAA,EACF;AAEA,MAAI,CAAC,qBAAqB,IAAI,GAAG;AAC/B,WAAO;AAAA,MACL,6DAA6D,KAAK,WAAW,IAAI;AAAA,IACnF;AACA,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,MAAI,KAAK,WAAW,eAAe,eAAe;AAChD,WAAO;AAAA,MACL,kDAAkD,KAAK,WAAW,UAAU;AAAA,IAC9E;AACA,UAAM,IAAI,iBAAiB,qCAAqC;AAAA,EAClE;AAEA,QAAM,SAAS,QAAQ,MAAM,QAAQ,UAAU,aAAa,QAAQ;AAEpE,MAAI,MAAM,MAAM,GAAG;AACjB,WAAO,MAAM,yBAAyB,OAAO,KAAK,EAAE;AACpD,UAAM,IAAI,qBAAqB,OAAO,KAAK;AAAA,EAC7C;AAEA,MAAI,qBAAqB,OAAO,KAAK,GAAG;AACtC,WAAO;AAAA,MACL,kBAAkB,MAAM,iBAAiB,KAAK;AAAA,QAC5C;AAAA,MACF,CAAC,sBAAsB,WAAW,kBAAkB,QAAQ,aAC1D,KAAK,EACP;AAAA,IACF;AACA,WAAO,OAAO;AAAA,EAChB;AAEA,SAAO;AAAA,IACL,kBAAkB,MAAM,iBAAiB,KAAK;AAAA,MAC5C;AAAA,IACF,CAAC,sBAAsB,WAAW,kBAAkB,QAAQ,aAC1D,KAAK,EACP;AAAA,EACF;AACA,SAAO,OAAO;AAChB;;;ACtDK,IAAM,mBACX,CAAC,QAAgB,YACjB,CAAC,YAA8B;AAC7B,QAAM,EAAE,KAAK,IAAI;AACjB,SAAO,KAAK,kBAAkB,KAAK,EAAE,EAAE;AAEvC,MAAI,CAAC,mBAAmB,IAAI,GAAG;AAC7B,WAAO;AAAA,MACL,2DAA2D,KAAK,WAAW,IAAI;AAAA,IACjF;AACA,UAAM,IAAI,iBAAiB,4CAA4C;AAAA,EACzE;AAEA,MACE,KAAK,WAAW,SAAS,WACzB,KAAK,WAAW,SAAS,WACzB;AACA,WAAO;AAAA,MACL,0DAA0D,KAAK,WAAW,IAAI;AAAA,IAChF;AACA,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,SAAS,QAAQ,IAAI;AAE3B,MAAI,MAAM,MAAM,GAAG;AACjB,WAAO,MAAM,wBAAwB,OAAO,KAAK,EAAE;AACnD,UAAM,IAAI,mBAAmB,OAAO,KAAK;AAAA,EAC3C;AAEA,SAAO,KAAK,iBAAiB,KAAK,EAAE,EAAE;AACtC,SAAO,OAAO;AAChB;;;ACzCK,IAAM,wBACX,CAAC,QAAgB,YACjB,CAAC,YAAY;AACX,QAAM,EAAE,QAAQ,IAAI;AACpB,SAAO,KAAK,+BAA+B;AAC3C,QAAM,SAAS,QAAQ,OAAO;AAE9B,MAAI,MAAM,MAAM,GAAG;AACjB,WAAO,MAAM,4BAA4B,OAAO,KAAK,EAAE;AACvD,UAAM,IAAI,MAAM,OAAO,KAAK;AAAA,EAC9B;AAEA,SAAO,KAAK,qBAAqB,OAAO,KAAK,EAAE;AAC/C,SAAO,OAAO;AAChB;;;ACTK,IAAM,WAAW;;;ACbjB,IAAM,SAAS;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;;;ACSO,IAAM,gBAAgB;AAAA,EAC3B,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,MAAM;AACR;;;AClBO,IAAM,0BAA0B,CACrC,YACA,MACA,oBACwB;AACxB,QAAM,sBAAsB,WAAW,OAAO,CAAC,SAAS;AACtD,WACE,KAAK,KAAK,OAAO,CAAC,MAAM,EAAE,SAAS,IAAI,EAAE,SAAS,MACjD,CAAC,KAAK,gBAAgB,KAAK,iBAAiB;AAAA,EAEjD,CAAC;AAED,MAAI,oBAAoB,WAAW,GAAG;AACpC,WAAO,IAAI,sBAAsB;AAAA,EACnC;AAEA,SAAO,GAAG,mBAAmB;AAC/B;AAEO,IAAM,cAAc,CACzB,MACA,eACsB;AACtB,QAAM,YAAY,WAAW,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI;AAExD,MAAI,CAAC,WAAW;AACd,WAAO,IAAI,mBAAmB,IAAI,EAAE;AAAA,EACtC;AAEA,SAAO,GAAG,SAAS;AACrB;;;AClBO,IAAM,uBACX,CAAC,SACD,CAAC,MAAM,UAAU;AACf,QAAM,EAAE,eAAe,IAAI;AAC3B,QAAM,sBAAsB,eAAe,YAAY;AAEvD,QAAM,gBAA6B,CAAC;AAEpC,aAAW,QAAQ,OAAO;AACxB,UAAM,SAAS,YAAY,MAAM,mBAAmB;AAEpD,QAAI,MAAM,MAAM,GAAG;AACjB,aAAO;AAAA,IACT;AAEA,kBAAc,KAAK,OAAO,KAAK;AAAA,EACjC;AAEA,QAAM,eAAe;AAAA,IACnB,OAAO,KAAK,MAAM;AAAA,IAClB,OAAO;AAAA,EACT;AAEA,QAAM,OAAiB;AAAA,IACrB,MAAM;AAAA,IACN,MAAM,UAAU;AAAA,EAClB;AAEA,QAAM,cAAgC;AAAA,IACpC,GAAG;AAAA,IACH,OAAO;AAAA,IACP,YAAY;AAAA,EACd;AAEA,SAAO,GAAG,WAAW;AACvB;;;ACzCF,IAAM,WAAW,CAAC,WAAkC;AAClD,SAAO,OAAO,SAAS,MAAM;AAC/B;AAEO,IAAM,aAAa,CACxB,QACA,SAAgB,MACK;AACrB,MAAI,SAAS,MAAM,GAAG;AACpB,WAAO,EAAE,MAAM,QAAQ,OAAO;AAAA,EAChC;AACA,SAAO,EAAE,MAAM,QAAQ,QAAQ,EAAE;AACnC;;;ACRO,IAAM,qBAAqB,MAAe;AAC/C,QAAM,YAAY,WAAW,OAAO;AACpC,QAAM,OAAO,MAAM;AAAA,IAAK,EAAE,QAAQ,SAAS;AAAA,IAAG,MAC5C,MAAM,KAAK,EAAE,QAAQ,SAAS,GAAG,MAAM,SAAS;AAAA,EAClD;AAEA,SAAO;AACT;AAEO,IAAM,cAAc,CAAC,YAA8B;AACxD,QAAM,SAAS,WAAW,QAAQ;AAClC,QAAM,aAAa,gBAAgB,OAAO;AAC1C,aAAW,CAAC,EAAG,CAAC,IAAI;AACpB,SAAO;AACT;AAEO,IAAM,YAAY,CACvB,SACA,UACA,SACY;AACZ,QAAM,aAAa,gBAAgB,OAAO;AAC1C,aAAW,SAAS,CAAC,EAAG,SAAS,CAAC,IAAI;AACtC,SAAO;AACT;AAEO,IAAM,UAAU,CACrB,SACA,aAC6B;AAC7B,QAAM,OAAO,QAAQ,SAAS,CAAC,IAAI,SAAS,CAAC;AAC7C,MAAI,CAAC,MAAM;AACT,WAAO,IAAI,2CAA2C;AAAA,EACxD;AACA,SAAO,GAAG,IAAI;AAChB;AAEO,IAAM,0BAA0B,CACrC,UACA,aACA,UACA,WAC6E;AAC7E,MAAI;AAIJ,MAAI;AAKJ,MAAI,gBAAgB,cAAc;AAChC,QAAI,aAAa,GAAG;AAClB,kBAAY;AAAA,QACV,MAAM,OAAO;AAAA,QACb,UAAU;AAAA,UACR,GAAG,SAAS;AAAA,UACZ,GAAG,SAAS;AAAA,QACd;AAAA,MACF;AACA,mBAAa;AAAA,QACX,MAAM,OAAO;AAAA,QACb,UAAU;AAAA,UACR,GAAG,SAAS,IAAI;AAAA,UAChB,GAAG,SAAS;AAAA,QACd;AAAA,MACF;AAAA,IACF,OAAO;AACL,kBAAY;AAAA,QACV,MAAM,OAAO;AAAA,QACb,UAAU;AAAA,UACR,GAAG,SAAS;AAAA,UACZ,GAAG,SAAS;AAAA,QACd;AAAA,MACF;AACA,mBAAa;AAAA,QACX,MAAM,OAAO;AAAA,QACb,UAAU;AAAA,UACR,GAAG,SAAS,IAAI;AAAA,UAChB,GAAG,SAAS;AAAA,QACd;AAAA,MACF;AAAA,IACF;AAAA,EACF,OAAO;AACL,QAAI,aAAa,GAAG;AAClB,kBAAY;AAAA,QACV,MAAM,OAAO;AAAA,QACb,UAAU;AAAA,UACR,GAAG,SAAS;AAAA,UACZ,GAAG,SAAS;AAAA,QACd;AAAA,MACF;AACA,mBAAa;AAAA,QACX,MAAM,OAAO;AAAA,QACb,UAAU;AAAA,UACR,GAAG,SAAS;AAAA,UACZ,GAAG,SAAS,IAAI;AAAA,QAClB;AAAA,MACF;AAAA,IACF,OAAO;AACL,kBAAY;AAAA,QACV,MAAM,OAAO;AAAA,QACb,UAAU;AAAA,UACR,GAAG,SAAS;AAAA,UACZ,GAAG,SAAS;AAAA,QACd;AAAA,MACF;AACA,mBAAa;AAAA,QACX,MAAM,OAAO;AAAA,QACb,UAAU;AAAA,UACR,GAAG,SAAS;AAAA,UACZ,GAAG,SAAS,IAAI;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO,CAAC,WAAW,UAAU;AAC/B;AAEO,IAAM,cAAc,CACzB,SACA,UACA,aACA,UACA,WACoB;AACpB,QAAM,CAAC,WAAW,UAAU,IAAI;AAAA,IAC9B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,oBAAoB;AAAA,IACxB;AAAA,IACA,UAAU;AAAA,IACV,WAAW;AAAA,EACb;AACA,MAAI,MAAM,iBAAiB,GAAG;AAC5B,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB;AAAA,IACpB;AAAA,IACA,UAAU;AAAA,IACV,WAAW;AAAA,EACb;AAEA,MAAI,cAAc,WAAW,GAAG;AAC9B,WAAO,IAAI,kCAAkC;AAAA,EAC/C;AAEA,QAAM,wBAAwB,iBAAiB,eAAe;AAAA,IAC5D,UAAU;AAAA,IACV,WAAW;AAAA,EACb,CAAC;AAED,MAAI,CAAC,uBAAuB;AAC1B,WAAO,IAAI,wCAAwC;AAAA,EACrD;AAEA,SAAO,GAAG,WAAW,SAAS,CAAC,WAAW,UAAU,CAAC,CAAC;AACxD;AAEA,IAAM,aAAa,CACjB,SACA,UACG;AACH,MAAI,aAAa,gBAAgB,OAAO;AACxC,aAAW,EAAE,MAAM,SAAS,KAAK,OAAO;AACtC,iBAAa,UAAU,YAAY,UAAU,IAAI;AAAA,EACnD;AACA,SAAO;AACT;AAEA,IAAM,cAAc,CAClB,SACA,eACA,mBACoB;AACpB,QAAM,YAAY,QAAQ,SAAS,aAAa;AAChD,QAAM,aAAa,QAAQ,SAAS,cAAc;AAElD,MAAI,MAAM,SAAS,GAAG;AACpB,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,UAAU,GAAG;AACrB,WAAO;AAAA,EACT;AAEA,MAAI,UAAU,MAAM,SAAS,WAAW,WAAW,MAAM,SAAS,SAAS;AACzE,WAAO,IAAI,+BAA+B;AAAA,EAC5C;AAEA,SAAO,GAAG,IAAI;AAChB;AAEA,IAAM,aAAa,CACjB,SACA,eACA,mBACW;AACX,QAAM,iBAAiB,cAAc;AACrC,QAAM,iBAAiB,cAAc;AACrC,QAAM,kBAAkB,eAAe;AACvC,QAAM,kBAAkB,eAAe;AAEvC,QAAM,gBAAwB,CAAC;AAC/B,QAAM,oBAAoB;AAAA,IACxB,EAAE,GAAG,iBAAiB,GAAG,GAAG,eAAe;AAAA,IAC3C,EAAE,GAAG,gBAAgB,GAAG,iBAAiB,EAAE;AAAA,IAC3C,EAAE,GAAG,iBAAiB,GAAG,GAAG,eAAe;AAAA,IAC3C,EAAE,GAAG,gBAAgB,GAAG,iBAAiB,EAAE;AAAA,IAC3C,EAAE,GAAG,kBAAkB,GAAG,GAAG,gBAAgB;AAAA,IAC7C,EAAE,GAAG,iBAAiB,GAAG,kBAAkB,EAAE;AAAA,IAC7C,EAAE,GAAG,kBAAkB,GAAG,GAAG,gBAAgB;AAAA,IAC7C,EAAE,GAAG,iBAAiB,GAAG,kBAAkB,EAAE;AAAA,EAC/C;AAGA,oBAAkB;AAAA,IAChB,kBAAkB,UAAU,CAAC,QAAQ;AACnC,aAAO,IAAI,MAAM,kBAAkB,IAAI,MAAM;AAAA,IAC/C,CAAC;AAAA,IACD;AAAA,EACF;AAEA,oBAAkB;AAAA,IAChB,kBAAkB,UAAU,CAAC,QAAQ;AACnC,aAAO,IAAI,MAAM,mBAAmB,IAAI,MAAM;AAAA,IAChD,CAAC;AAAA,IACD;AAAA,EACF;AAEA,oBAAkB,QAAQ,CAAC,QAAQ;AACjC,UAAM,OAAO,QAAQ,SAAS,GAAG;AACjC,QAAI,KAAK,IAAI,GAAG;AACd,UAAI,KAAK,MAAM,SAAS,SAAS;AAC/B,sBAAc,KAAK,KAAK,KAAK;AAAA,MAC/B;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAEA,IAAM,mBAAmB,CACvB,eACA,UACY;AACZ,SAAO,cAAc,KAAK,CAAC,iBAAiB;AAC1C,WAAO,MAAM,KAAK,CAAC,SAAS;AAC1B,aAAO,KAAK,SAAS,aAAa,QAAQ,aAAa,SAAS;AAAA,IAClE,CAAC;AAAA,EACH,CAAC;AACH;AAEO,IAAM,wBAAwB,CAAC,YAA8B;AAElE,QAAM,iBAAiB,QACpB,IAAI,CAAC,QAAQ,IAAI,UAAU,CAAC,SAAS,KAAK,SAAS,QAAQ,CAAC,EAC5D,KAAK,CAAC,UAAU,UAAU,EAAE;AAG/B,QAAM,YACJ,mBAAmB,SACf,QAAQ,cAAc,EAAG,MAAM,GAAG,cAAc,IAChD,CAAC;AACP,QAAM,iBAAiB,UAAU;AAAA,IAC/B,CAAC,SAAS,KAAK,SAAS;AAAA,EAC1B,EAAE;AAGF,QAAM,aACJ,mBAAmB,SACf,QAAQ,cAAc,EAAG,MAAM,iBAAiB,CAAC,IACjD,CAAC;AACP,QAAM,kBAAkB,WAAW;AAAA,IACjC,CAAC,SAAS,KAAK,SAAS;AAAA,EAC1B,EAAE;AAGF,QAAM,WACJ,mBAAmB,SACf,QAAQ,cAAc,EAAG,MAAM,GAAG,cAAc,IAChD,CAAC;AACP,QAAM,gBAAgB,SAAS,OAAO,CAAC,SAAS,KAAK,SAAS,OAAO,EAAE;AAGvE,QAAM,cACJ,kBAAkB,SACd,QAAQ,cAAc,EAAG,MAAM,iBAAiB,CAAC,IACjD,CAAC;AACP,QAAM,mBAAmB,YAAY;AAAA,IACnC,CAAC,SAAS,KAAK,SAAS;AAAA,EAC1B,EAAE;AAEF,SACE,mBAAmB,mBACnB,kBAAkB,oBAClB,mBAAmB;AAEvB;AAEO,IAAM,gBAAgB,CAAC,YAA6B;AACzD,QAAM,aAAa,QAAQ,KAAK,EAAE,OAAO,CAAC,SAAS,KAAK,SAAS,OAAO;AACxE,QAAM,iBAAiB,WAAW,SAAS,KAAK;AAChD,SAAO;AACT;AAEA,IAAM,kBAAkB,CAAC,YAA8B;AACrD,SAAO,QAAQ,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC,UAAU,EAAE,GAAG,KAAK,EAAE,CAAC;AAChE;;;ACpUA,IAAM,uBAAuB;AAEtB,IAAM,iBAAiB,CAAC,SAAiC;AAC9D,MAAI,CAAC,QAAQ,KAAK,KAAK,EAAE,SAAS,sBAAsB;AACtD,WAAO,IAAI,wBAAwB,IAAI,EAAE;AAAA,EAC3C;AAEA,SAAO,GAAG,IAAI;AAChB;AAEO,IAAM,eAAe,CAC1B,YACA,IACA,YACmB;AACnB,QAAM,OAAO,eAAe,UAAU;AAEtC,MAAI,MAAM,IAAI,GAAG;AACf,WAAO;AAAA,EACT;AAEA,SAAO,GAAG;AAAA,IACR,MAAM,KAAK;AAAA,IACX;AAAA,IACA;AAAA,EACF,CAAC;AACH;;;ACVO,IAAM,oBACX,CAAC,SAKD,CAAC,MAAM,YAAY;AACjB,QAAM,EAAE,YAAAG,aAAY,eAAAC,gBAAe,eAAe,IAAI;AAEtD,MAAI,CAAC,WAAW,QAAQ,SAAS,KAAK,QAAQ,SAAS,GAAG;AACxD,WAAO,IAAI,2BAA2B;AAAA,EACxC;AAEA,QAAM,aAAsB,CAAC;AAE7B,aAAW,UAAU,SAAS;AAC5B,QAAI,UAAU,mBAAmB;AACjC,cAAU,YAAY,OAAO;AAC7B,QAAI,KAAKD,YAAW;AACpB,UAAM,YAAY,aAAa,QAAQ,IAAI,OAAO;AAElD,QAAI,MAAM,SAAS,GAAG;AACpB,aAAO;AAAA,IACT;AAEA,eAAW,KAAK,UAAU,KAAK;AAAA,EACjC;AAGA,QAAM,QAAQ,eAAe,OAAO;AACpC,QAAM,aAAa,MAAM,MAAM,WAAW,MAAM;AAEhD,MAAI,CAAC,YAAY;AACf,WAAO,IAAI,qBAAqB;AAAA,EAClC;AAGA,QAAM,WAAW,KAAK;AACtB,QAAM,EAAE,YAAY,IAAI;AACxB,QAAM,mBAAmBC,eAAc,QAAQ;AAC/C,QAAM,kBAAkB,iBAAiB,MAAM,GAAG,WAAW;AAC7D,QAAM,OAAiB;AAAA,IACrB,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAEA,QAAM,cAAgC;AAAA,IACpC,GAAG;AAAA,IACH,SAAS;AAAA,IACT,UAAU;AAAA,IACV,OAAO;AAAA,MACL,GAAG,KAAK;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA,YAAY;AAAA,EACd;AAEA,SAAO,GAAG,WAAW;AACvB;;;AC1EK,IAAM,aAAa,CAAC,IAAY,aAA2B;AAChE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX,SAAS;AAAA,IACT,UAAU;AAAA,EACZ;AACF;AAEA,IAAM,UAAU,CAAC,SAAwB,KAAK;AAC9C,IAAM,WAAW,CAAC,SAAwB,KAAK;AAC/C,IAAM,eAAe,CAAC,SAAwB,KAAK;AAE5C,IAAM,UAAU,CAAC,SAAwB;AAC9C,SAAO,CAAC,QAAQ,IAAI,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,aAAa,IAAI;AAChE;AAEO,IAAM,UAAU,CAAC,SAAwB;AAC9C,SAAO,CAAC,QAAQ,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,aAAa,IAAI;AAC/D;AAEO,IAAM,mCAAmC,CAC9C,SACwD;AACxD,SACE,CAAC,QAAQ,IAAI,KACb,CAAC,SAAS,IAAI,KACd,CAAC,aAAa,IAAI,KAClB,KAAK,iBAAiB;AAE1B;AAEO,IAAM,kBAAkB,CAAC,UAA0B;AACxD,SAAO,MAAM,KAAK,CAAC,GAAG,MAAM;AAC1B,WAAO,EAAE,aAAc,SAAS,EAAE,aAAc;AAAA,EAClD,CAAC;AACH;AAEO,IAAM,oBAAoB,CAAC,SAAyB;AACzD,QAAM,YAAY,CAAC,GAAG,IAAI;AAC1B,aAAWC,SAAQ,WAAW;AAC5B,IAAAA,MAAK,YAAY;AACjB,IAAAA,MAAK,UAAU;AACf,IAAAA,MAAK,WAAW;AAAA,EAClB;AAEA,SAAO;AACT;AAEO,IAAM,qBAAqB,CAAC,UAA8B;AAC/D,QAAM,WAAW,aAAa,KAAK;AAEnC,SAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU,SAAS;AAAA,IACnB,YAAY,SAAS,QAAQ,IACzB,cAAc,aACd,cAAc;AAAA,EACpB;AACF;AAEA,IAAM,eAAe,CAAC,UAAwB;AAC5C,QAAM,OAAO,MAAM,KAAK,CAACA,UAAS,CAAC,aAAaA,KAAI,CAAC;AACrD,MAAI,CAAC,MAAM;AACT,WAAO,MAAM,CAAC;AAAA,EAChB;AACA,SAAO;AACT;AAEO,IAAM,qBAAqB,CAAC,UAAkB;AACnD,SAAO,MAAM,MAAM,CAAC,SAAS,KAAK,SAAS;AAC7C;;;AC5DO,IAAM,sBAA2C,CACtD,MACA,QACA,eACG;AACH,QAAM,cAAc,KAAK,MAAM;AAAA,IAC7B,CAAC,SAAS,KAAK,OAAO,KAAK,WAAW;AAAA,EACxC;AAEA,MAAI,CAAC,aAAa;AAChB,WAAO,IAAI,gBAAgB;AAAA,EAC7B;AAEA,MAAI,YAAY,OAAO,QAAQ;AAC7B,WAAO,IAAI,eAAe;AAAA,EAC5B;AAEA,MAAI,CAAC,QAAQ,WAAW,GAAG;AACzB,WAAO,IAAI,iBAAiB;AAAA,EAC9B;AAGA,QAAM,iBAAiB,KAAK,gBAAgB;AAAA,IAC1C,CAAC,WAAW,OAAO,OAAO,WAAW;AAAA,EACvC;AAEA,MAAI,CAAC,gBAAgB;AACnB,WAAO,IAAI,kBAAkB;AAAA,EAC/B;AAEA,MAAI,eAAe,QAAQ;AACzB,WAAO,IAAI,uBAAuB;AAAA,EACpC;AAGA,QAAM,yBAAyB,KAAK,gBAAgB,IAAI,CAAC,WAAW;AAClE,QAAI,OAAO,OAAO,WAAW,YAAY;AACvC,aAAO,SAAS;AAChB,aAAO,SAAS,YAAY;AAAA,IAC9B;AACA,WAAO;AAAA,EACT,CAAC;AAGD,QAAM,eAAe,KAAK,MAAM,IAAI,CAAC,SAAS;AAC5C,QAAI,KAAK,OAAO,YAAY,IAAI;AAC9B,WAAK,UAAU;AACf,WAAK,YAAY;AACjB,WAAK,eAAe,eAAe;AAAA,IACrC;AACA,WAAO;AAAA,EACT,CAAC;AAED,QAAM,YAAY,mBAAmB,YAAY;AAEjD,MAAI,WAAW;AACb,UAAM,QAAQ,kBAAkB,gBAAgB,YAAY,CAAC;AAC7D,UAAM,cAAc,KAAK,OAAO;AAChC,UAAMC,QAAO,mBAAmB,KAAK;AACrC,UAAM,eAAe,CAAC,GAAG,KAAK,QAAQ;AACtC,UAAM,gBAAgB,aAAa;AAAA,MACjC;AAAA,MACA,KAAK,MAAM,MAAM;AAAA,IACnB;AACA,kBAAc,KAAK,CAAC,GAAG,MAAM,EAAE,SAAS,EAAE,MAAM;AAChD,UAAMC,0BAAyB,cAAc,IAAI,CAAC,QAAQ,UAAU;AAClE,aAAO;AAAA,QACL;AAAA,QACA,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,UAAU,QAAQ;AAAA,MACpB;AAAA,IACF,CAAC;AAED,WAAO,GAAG;AAAA,MACR,GAAG;AAAA,MACH,iBAAiBA;AAAA,MACjB,UAAU;AAAA,MACV;AAAA,MACA,MAAM;AAAA,MACN,YAAYD;AAAA,IACd,CAAC;AAAA,EACH;AAEA,QAAM,OAAO,mBAAmB,YAAY;AAG5C,QAAM,eAAe;AAAA,IACnB,GAAG;AAAA,IACH,iBAAiB;AAAA,IACjB,OAAO;AAAA,IACP,YAAY;AAAA,EACd;AAEA,SAAO,GAAG,YAAY;AACxB;;;ACxGO,IAAM,SAAS,CAAC,YAIC;AACtB,QAAM,EAAE,IAAI,MAAM,SAAS,IAAI;AAC/B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,iBAAiB,CAAC;AAAA,IAClB,SAAS,CAAC;AAAA,IACV,OAAO,CAAC;AAAA,IACR,MAAM;AAAA,IACN,YAAY;AAAA,MACV,MAAM;AAAA,MACN,MAAM,UAAU;AAAA,IAClB;AAAA,IACA,OAAO;AAAA,MACL,OAAO;AAAA,QACL,OAAO;AAAA,QACP,aAAa;AAAA,QACb,iBAAiB;AAAA,QACjB,UAAU;AAAA,MACZ;AAAA,MACA,OAAO,CAAC;AAAA,IACV;AAAA,IACA;AAAA,EACF;AACF;;;AChCA,IAAM,WAAW,CACf,MACA,kBACyB;AACzB,SAAO,cAAc,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI;AAClD;AAEO,IAAM,aAAa,CACxB,MACA,kBACqB;AACrB,QAAM,YAAY,SAAS,MAAM,aAAa;AAC9C,MAAI,WAAW;AACb,WAAO,GAAG,SAAS;AAAA,EACrB;AAEA,SAAO,IAAI,iBAAiB,IAAI,EAAE;AACpC;;;ACVO,IAAM,oBACX,CAAC,SAKD,CAAC,SAAS;AACR,QAAM,EAAE,gBAAgB,oBAAoB,YAAAE,YAAW,IAAI;AAC3D,QAAM,KAAKA,YAAW;AACtB,QAAM,gBAAgB,eAAe,cAAc;AACnD,QAAM,UAAU,WAAW,MAAM,aAAa;AAE9C,MAAI,MAAM,OAAO,GAAG;AAClB,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,mBAAmB,WAAW,QAAQ,KAAK;AAE5D,MAAI,CAAC,YAAY,SAAS,WAAW,GAAG;AACtC,WAAO,IAAI,8BAA8B,QAAQ,MAAM,IAAI,EAAE;AAAA,EAC/D;AAEA,QAAM,UAAU;AAAA,IACd;AAAA,IACA,MAAM,QAAQ;AAAA,IACd;AAAA,EACF;AAEA,QAAM,UAAU,OAAO,OAAO;AAE9B,SAAO,GAAG,OAAO;AACnB;;;ACrBK,IAAM,uBAA6C,CAAC,MAAM,WAAW;AAC1E,QAAM,aAAa,KAAK;AAExB,QAAM,cAAc,KAAK,MAAM;AAAA,IAC7B,CAAC,SAAS,KAAK,OAAO,WAAW;AAAA,EACnC;AAEA,MAAI,CAAC,aAAa;AAChB,WAAO,IAAI,gBAAgB;AAAA,EAC7B;AAEA,MAAI,YAAY,OAAO,QAAQ;AAC7B,WAAO,IAAI,eAAe;AAAA,EAC5B;AAEA,MAAI,CAAC,QAAQ,WAAW,GAAG;AACzB,WAAO,IAAI,iBAAiB;AAAA,EAC9B;AAEA,QAAM,WAAW,KAAK,MAAM,MAAM;AAClC,QAAM,cAAc,KAAK;AACzB,QAAM,aAAa,gBAAgB;AAEnC,QAAM,cAAc,KAAK,MAAM,IAAI,CAAC,SAAS;AAC3C,QAAI,KAAK,OAAO,YAAY,IAAI;AAC9B,UAAI,YAAY;AACd,eAAO;AAAA,UACL,GAAG;AAAA,UACH,WAAW;AAAA,UACX,UAAU;AAAA,QACZ;AAAA,MACF;AAEA,aAAO;AAAA,QACL,GAAG;AAAA,QACH,UAAU;AAAA,MACZ;AAAA,IACF;AACA,WAAO;AAAA,EACT,CAAC;AAED,MAAI;AAEJ,QAAM,aAAuB;AAAA,IAC3B,MAAM;AAAA,IACN,MAAM,UAAU;AAAA,EAClB;AAEA,MAAI,cAAc,mBAAmB,WAAW,GAAG;AACjD,kBAAc;AAAA,MACZ,GAAG;AAAA,MACH,OAAO;AAAA,MACP,YAAY;AAAA,IACd;AAAA,EACF,OAAO;AACL,kBAAc;AAAA,MACZ,GAAG;AAAA,MACH,OAAO;AAAA,MACP,YAAwB,mBAAmB,WAAW;AAAA,IACxD;AAAA,EACF;AAEA,SAAO,GAAG,WAAW;AACvB;;;ACxEO,IAAM,uBACX,CAAC,SACD,CAAC,MAAwB,YAAyC;AAChE,QAAM,EAAE,eAAe,IAAI;AAE3B,QAAM,gBAAgB,eAAe,YAAY;AAEjD,MAAI,CAAC,eAAe;AAClB,WAAO,IAAI,gBAAgB;AAAA,EAC7B;AAEA,SAAO,wBAAwB,eAAe,MAAM,OAAO;AAC7D;;;ACjBK,IAAM,kBACX,CAAC,SACD,MAA0B;AACxB,QAAM,EAAE,eAAe,IAAI;AAC3B,SAAO,GAAG,eAAe,cAAc,CAAC;AAC1C;;;ACMK,IAAM,mBAAqC,CAAC,MAAM,gBAAgB;AACvE,QAAM,EAAE,MAAM,IAAI;AAClB,QAAM,EAAE,OAAO,MAAM,IAAI;AAEzB,QAAM,mBAAmB,YAAY,IAAI,CAAC,UAAuB;AAC/D,QAAI,aAAa,MAAM,QAAQ;AAE/B,UAAM,UAAU,KAAK,QAAQ,KAAK,CAAC,WAAW;AAC5C,UAAI,OAAO,OAAO,MAAM,UAAU;AAChC,eAAO;AAAA,MACT;AAAA,IACF,CAAC,GAAG;AAEJ,QAAI,MAAM,SAAS,GAAG;AACpB,YAAM,QAAQ,CAAC,cAAc;AAC3B,YAAI,UAAU,SAAS,sBAAsB;AAC3C,gBAAM,mBAAmB,sBAAsB,OAAO;AACtD,cAAI,kBAAkB;AACpB,0BAAc;AAAA,UAChB;AAAA,QACF;AAEA,YAAI,UAAU,SAAS,WAAW;AAChC,gBAAM,gBAAgB,cAAc,OAAO;AAC3C,gBAAM,cAAc,MAAM;AAC1B,gBAAM,eAAe,KAAK,QAAQ;AAClC,gBAAM,oBAAoB,cAAc;AACxC,cAAI,kBAAkB,mBAAmB;AACvC,0BAAc;AAAA,UAChB;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,MACL,GAAG;AAAA,MACH,SAAS;AAAA,QACP,GAAG,MAAM;AAAA,QACT,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF,CAAC;AAGD,mBAAiB,KAAK,CAAC,GAAG,MAAM;AAC9B,QAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,QAAQ;AACzC,aAAO,EAAE,QAAQ,SAAS,EAAE,QAAQ;AAAA,IACtC;AACA,QAAI,EAAE,QAAQ,sBAAsB,EAAE,QAAQ,mBAAmB;AAC/D,aAAO,EAAE,QAAQ,oBAAoB,EAAE,QAAQ;AAAA,IACjD;AACA,WAAO,EAAE,QAAQ,cAAc,EAAE,QAAQ;AAAA,EAC3C,CAAC;AAED,QAAM,SAAwB,CAAC;AAE/B,MAAI,QAAQ;AACZ,SAAO,KAAK;AAAA,IACV,UAAU,iBAAiB,CAAC,EAAG;AAAA,IAC/B,YAAY,iBAAiB,CAAC,EAAG;AAAA,IACjC,SAAS,iBAAiB,CAAC,EAAG;AAAA,IAC9B,UAAU;AAAA,EACZ,CAAC;AAED,WAAS,IAAI,GAAG,IAAI,iBAAiB,QAAQ,KAAK;AAChD,UAAM,eAAe,iBAAiB,CAAC;AACvC,UAAM,gBAAgB,iBAAiB,IAAI,CAAC;AAC5C,QACE,iBACA,gBACA,aAAa,QAAQ,WAAW,cAAc,QAAQ,UACtD,aAAa,QAAQ,sBACnB,cAAc,QAAQ,qBACxB,aAAa,QAAQ,gBAAgB,cAAc,QAAQ,aAC3D;AACA,cAAQ;AAAA,IACV;AAEA,QAAI,OAAO;AACT,aAAO,KAAK;AAAA,QACV,GAAG;AAAA,QACH,UAAU,OAAO,IAAI,CAAC,EAAG;AAAA,MAC3B,CAAC;AAAA,IACH,OAAO;AACL,aAAO,KAAK;AAAA,QACV,GAAG;AAAA,QACH,UAAU,IAAI;AAAA,MAChB,CAAC;AAAA,IACH;AAEA,YAAQ;AAAA,EACV;AAEA,SAAO,GAAG;AAAA,IACR,GAAG;AAAA,IACH;AAAA,EACF,CAAC;AACH;;;ACrFO,IAAM,qBAAyC,CACpD,MACA,QACA,UACA,aACA,aACG;AACH,QAAM,aAAa,KAAK;AAExB,QAAM,cAAc,KAAK,MAAM;AAAA,IAC7B,CAAC,SAAS,KAAK,OAAO,WAAW;AAAA,EACnC;AAEA,MAAI,CAAC,aAAa;AAChB,WAAO,IAAI,gBAAgB;AAAA,EAC7B;AAEA,MAAI,YAAY,OAAO,QAAQ;AAC7B,WAAO,IAAI,eAAe;AAAA,EAC5B;AAEA,MAAI,CAAC,iCAAiC,WAAW,GAAG;AAClD,WAAO,IAAI,kBAAkB;AAAA,EAC/B;AAEA,QAAM,SAAS,YAAY;AAE3B,QAAM,gBAAgB,KAAK,QAAQ;AAAA,IACjC,CAAC,WAAW,OAAO,OAAO,YAAY;AAAA,EACxC;AAEA,MAAI,CAAC,eAAe;AAClB,WAAO,IAAI,kBAAkB;AAAA,EAC/B;AAEA,QAAM,iBAAiB;AAAA,IACrB,cAAc;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,MAAI,MAAM,cAAc,GAAG;AACzB,WAAO;AAAA,EACT;AAEA,QAAM,iBAAiB,KAAK,QAAQ,IAAI,CAAC,WAAW;AAClD,QAAI,OAAO,OAAO,cAAc,IAAI;AAClC,aAAO,UAAU,eAAe;AAAA,IAClC;AACA,WAAO;AAAA,EACT,CAAC;AAED,QAAM,WAAW,KAAK,MAAM,MAAM;AAClC,QAAM,cAAc,KAAK;AACzB,QAAM,aAAa,gBAAgB;AAEnC,QAAM,eAAe,KAAK,MAAM,IAAI,CAAC,SAAS;AAC5C,QAAI,KAAK,OAAO,YAAY,IAAI;AAC9B,UAAI,YAAY;AACd,eAAO;AAAA,UACL,GAAG;AAAA,UACH,WAAW;AAAA,UACX,UAAU;AAAA,QACZ;AAAA,MACF;AACA,aAAO;AAAA,QACL,GAAG;AAAA,QACH,UAAU;AAAA,MACZ;AAAA,IACF;AACA,WAAO;AAAA,EACT,CAAC;AAED,MAAI;AAEJ,QAAM,aAAuB;AAAA,IAC3B,MAAM;AAAA,IACN,MAAM,UAAU;AAAA,EAClB;AAEA,MAAI,cAAc,mBAAmB,YAAY,GAAG;AAClD,kBAAc;AAAA,MACZ,GAAG;AAAA,MACH,OAAO;AAAA,MACP,YAAY;AAAA,MACZ,SAAS;AAAA,IACX;AAAA,EACF,OAAO;AACL,kBAAc;AAAA,MACZ,GAAG;AAAA,MACH,OAAO;AAAA,MACP,YAAwB,mBAAmB,YAAY;AAAA,MACvD,SAAS;AAAA,IACX;AAAA,EACF;AAEA,SAAO,GAAG,WAAW;AACvB;;;AChHO,IAAM,mBACX,CAAC,SAID,CAAC,SAAS;AACR,QAAM,EAAE,YAAAC,aAAY,eAAAC,eAAc,IAAI;AACtC,QAAM;AAAA,IACJ,OAAO;AAAA,MACL,OAAO,EAAE,OAAO,UAAU,gBAAgB;AAAA,IAC5C;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,kBAAkB,QAAQ;AAEhC,QAAM,WAAmB,CAAC;AAE1B,WAAS,IAAI,GAAG,IAAI,iBAAiB,KAAK;AACxC,aAAS,IAAI,GAAG,IAAI,UAAU,KAAK;AACjC,YAAM,OAAO,WAAWD,YAAW,GAAG,QAAQ,CAAC,EAAG,EAAE;AACpD,eAAS,KAAK,IAAI;AAAA,IACpB;AAAA,EACF;AAEA,QAAM,gBAAgBC,eAAc,QAAQ;AAC5C,QAAM,eAAe,CAAC,GAAG,QAAQ;AACjC,QAAM,gBAAgB,aAAa,OAAO,GAAG,eAAe;AAC5D,gBAAc,KAAK,CAAC,GAAG,MAAM,EAAE,SAAS,EAAE,MAAM;AAChD,QAAM,aAAyB;AAAA,IAC7B,MAAM;AAAA,IACN,UAAU,cAAc,CAAC,EAAG;AAAA,IAC5B,YAAY,cAAc;AAAA,EAC5B;AAEA,QAAM,WAA+B;AAAA,IACnC,GAAG;AAAA,IACH,OAAO;AAAA,IACP;AAAA,IACA,UAAU;AAAA,IACV,iBAAiB,cAAc,IAAI,CAAC,QAAQ,UAAU;AACpD,aAAO;AAAA,QACL;AAAA,QACA,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,UAAU,QAAQ;AAAA,MACpB;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO,GAAG,QAAQ;AACpB;;;ACxDK,IAAM,wBAA+C,CAAC,YAAY;AACvE,QAAM,UAAuB,QAAQ,IAAI,CAAC,QAAQ,IAAI,IAAI,MAAM,KAAK,CAAC;AACtE,QAAM,aAAyB,CAAC;AAEhC,QAAM,aAAa;AAAA,IACjB,CAAC,IAAI,CAAC;AAAA,IACN,CAAC,GAAG,CAAC;AAAA,IACL,CAAC,GAAG,EAAE;AAAA,IACN,CAAC,GAAG,CAAC;AAAA,EACP;AAEA,QAAM,WAAW,CACf,GACA,GACA,MACA,WACS;AACT,QACE,IAAI,KACJ,IAAI,KACJ,KAAK,QAAQ,CAAC,EAAG,UACjB,KAAK,QAAQ,UACb,QAAQ,CAAC,EAAG,CAAC,KACb,QAAQ,CAAC,EAAG,CAAC,EAAG,SAAS,QACzB,QAAQ,CAAC,EAAG,CAAC,EAAG,SAAS,WACzB,QAAQ,CAAC,EAAG,CAAC,EAAG,SAAS,UACzB;AACA;AAAA,IACF;AAEA,YAAQ,CAAC,EAAG,CAAC,IAAI;AACjB,UAAM,cAAc,WAAW;AAAA,MAC7B,CAAC,aACC,SAAS,SAAS,QAClB,SAAS,MAAM,KAAK,CAAC,CAAC,IAAI,EAAE,MAAM;AAChC,iBAAS,CAAC,IAAI,EAAE,KAAK,YAAY;AAC/B,cACG,KAAiB,OAAkB,KACnC,KAAiB,OAAkB,GACpC;AACA,mBAAO;AAAA,UACT;AAAA,QACF;AACA,eAAO;AAAA,MACT,CAAC;AAAA,IACL;AAEA,QAAI,aAAa;AACf,kBAAY,QAAQ;AACpB,kBAAY,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;AAC7B,kBAAY,UAAU;AAAA,IACxB,OAAO;AACL,iBAAW,KAAK;AAAA,QACd;AAAA,QACA;AAAA,QACA,MAAM;AAAA,QACN,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC;AAAA,MAChB,CAAC;AAAA,IACH;AAEA,eAAW,QAAQ,CAAC,CAAC,IAAI,EAAE,MAAM;AAC/B,YAAM,KAAK,IAAK;AAChB,YAAM,KAAK,IAAK;AAChB,UACE,MAAM,KACN,MAAM,KACN,KAAK,QAAQ,CAAC,EAAG,UACjB,KAAK,QAAQ,UACb,QAAQ,EAAE,EAAG,EAAE,EAAG,SAAS,MAC3B;AACA,iBAAS,IAAI,IAAI,QAAQ,EAAE,EAAG,EAAE,EAAG,MAAM,QAAQ,EAAE,EAAG,EAAE,EAAG,MAAM;AAAA,MACnE;AAAA,IACF,CAAC;AAAA,EACH;AAEA,UAAQ,QAAQ,CAAC,KAAK,MAAM;AAC1B,QAAI,QAAQ,CAAC,MAAM,MAAM;AACvB,UAAI,CAAC,QAAQ,CAAC,EAAG,CAAC,GAAG;AACnB,iBAAS,GAAG,GAAG,KAAK,MAAM,KAAK,MAAM;AAAA,MACvC;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAED,MAAI,WAAW,WAAW,GAAG;AAC3B,WAAO,GAAG;AAAA,MACR,QAAQ;AAAA,MACR,mBAAmB;AAAA,MACnB,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AAEA,MAAI,SAAS,WAAW,OAAO,CAAC,KAAK,aAAa;AAChD,WAAO,MAAM,SAAS,OAAO,SAAS;AAAA,EACxC,GAAG,CAAC;AAEJ,QAAM,oBAAoB,KAAK;AAAA,IAC7B,GAAG,WAAW,IAAI,CAAC,aAAa,SAAS,IAAI;AAAA,EAC/C;AACA,QAAM,cAAc,WAAW;AAAA,IAC7B,CAAC,KAAK,aAAa,MAAM,SAAS;AAAA,IAClC;AAAA,EACF;AAEA,SAAO,GAAG;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;;;ACnFO,IAAM,kBAAkB,CAAC,WAAkC;AAChE,QAAM,iBAAiB,kBAAU;AACjC,QAAM,qBAAqB,qBAAa;AACxC,QAAM,iBAAiB,kBAAU;AACjC,QAAM,OAAO,OAAO,cAAc;AAClC,QAAM,UAAU,OAAO,iBAAiB;AACxC,QAAM,SAAS,OAAO,UAAU,cAAc,IAAI,IAAI,cAAc,KAAK;AAEzE,SAAO;AAAA,IACL,mBAAmB;AAAA,MACjB;AAAA,MACA,kBAAkB;AAAA,QAChB;AAAA,QACA;AAAA,QACA,YAAY;AAAA,MACd,CAAC;AAAA,IACH;AAAA,IACA,iBAAiB;AAAA,MACf;AAAA,MACA,gBAAgB,EAAE,eAAe,CAAC;AAAA,IACpC;AAAA,IACA,sBAAsB;AAAA,MACpB;AAAA,MACA,qBAAqB,EAAE,eAAe,CAAC;AAAA,IACzC;AAAA,IACA,mBAAmB;AAAA,MACjB;AAAA,MACA,kBAAkB;AAAA,QAChB,YAAY;AAAA,QACZ,eAAe;AAAA,QACf;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA,sBAAsB;AAAA,MACpB;AAAA,MACA,qBAAqB,EAAE,eAAe,CAAC;AAAA,IACzC;AAAA,IACA,kBAAkB;AAAA,MAChB;AAAA,MACA,iBAAiB,EAAE,YAAY,MAAM,eAAe,QAAQ,CAAC;AAAA,IAC/D;AAAA,IACA,qBAAqB,oBAAoB,QAAQ,mBAAmB;AAAA,IACpE,oBAAoB,mBAAmB,QAAQ,kBAAkB;AAAA,IACjE,sBAAsB,qBAAqB,QAAQ,oBAAoB;AAAA,IACvE,kBAAkB,iBAAiB,QAAQ;AAAA,MACzC;AAAA,MACA;AAAA,IACF,CAAC;AAAA,IACD,uBAAuB,sBAAsB,QAAQ,qBAAqB;AAAA,EAC5E;AACF;;;ACpFO,IAAM,mBAAmB,CAAC,WAA8C;AAC7E,QAAM;AAAA,IACJ,mBAAAC;AAAA,IACA,iBAAAC;AAAA,IACA,sBAAAC;AAAA,IACA,mBAAAC;AAAA,IACA,sBAAAC;AAAA,IACA,kBAAAC;AAAA,IACA,qBAAAC;AAAA,IACA,oBAAAC;AAAA,IACA,sBAAAC;AAAA,IACA,kBAAAC;AAAA,IACA,uBAAAC;AAAA,EACF,IAAI,gBAAgB,MAAM;AAE1B,SAAO;AAAA,IACL,UAAU,CAAC,YAAYT,iBAAgB,OAAO;AAAA,IAC9C,eAAe,CAAC,YAAYC,sBAAqB,OAAO;AAAA,IACxD,YAAY,CAAC,YAAYF,mBAAkB,OAAO;AAAA,IAClD,YAAY,CAAC,YAAYG,mBAAkB,OAAO;AAAA,IAClD,eAAe,CAAC,YAAYC,sBAAqB,OAAO;AAAA,IACxD,WAAW,CAAC,YAAYC,kBAAiB,OAAO;AAAA,IAChD,cAAc,CAAC,YAAYC,qBAAoB,OAAO;AAAA,IACtD,aAAa,CAAC,YAAYC,oBAAmB,OAAO;AAAA,IACpD,eAAe,CAAC,YAAYC,sBAAqB,OAAO;AAAA,IACxD,YAAY,CAAC,YAAYC,kBAAiB,OAAO;AAAA,IACjD,gBAAgB,CAAC,YAAYC,uBAAsB,OAAO;AAAA,EAC5D;AACF;","names":["getResultUseCase","calculateScoreUseCase","result","uuidMethod","shuffleMethod","lord","next","updatedCurrentDominoes","uuidMethod","uuidMethod","shuffleMethod","createGameHandler","getModesHandler","getExtraRulesHandler","addPlayersHandler","addExtraRulesHandler","startGameHandler","chooseDominoHandler","placeDominoHandler","discardDominoHandler","getResultHandler","calculateScoreHandler"]}
1
+ {"version":3,"sources":["../src/datasources/dominoes.json","../src/adapterServerside/jsonDominoes.ts","../src/datasources/modes.json","../src/adapterServerside/jsonModes.ts","../src/datasources/rules.json","../src/adapterServerside/jsonRules.ts","../src/adapterServerside/shuffle.ts","../src/adapterServerside/uuid.ts","../src/adapterServerside/winstonLogger.ts","../src/core/domain/errors/domainErrors.ts","../src/core/domain/types/game.ts","../src/utils/result.ts","../src/application/handlers/addExtraRulesHandler.ts","../src/application/handlers/addPlayersHandler.ts","../src/application/handlers/chooseDominoHandler.ts","../src/application/handlers/createGameHandler.ts","../src/application/handlers/discardDominoHandler.ts","../src/application/handlers/getExtraRulesHandler.ts","../src/application/handlers/getModesHandler.ts","../src/application/handlers/getResultHandler.ts","../src/application/handlers/placeDominoHandler.ts","../src/application/handlers/startGameHandler.ts","../src/application/handlers/calculateScoreHandler.ts","../src/core/domain/types/kingdom.ts","../src/core/domain/types/domino.ts","../src/core/domain/types/player.ts","../src/core/domain/entities/rule.ts","../src/core/useCases/addExtraRules.ts","../src/core/domain/entities/domino.ts","../src/core/domain/entities/kingdom.ts","../src/core/domain/entities/player.ts","../src/core/useCases/addPlayers.ts","../src/core/domain/entities/lord.ts","../src/core/useCases/chooseDomino.ts","../src/core/domain/entities/game.ts","../src/core/domain/entities/mode.ts","../src/core/useCases/createGame.ts","../src/core/useCases/discardDomino.ts","../src/core/useCases/getExtraRules.ts","../src/core/useCases/getModes.ts","../src/core/useCases/getResult.ts","../src/core/useCases/placeDomino.ts","../src/core/useCases/startGame.ts","../src/core/useCases/calculateScore.ts","../src/config.ts","../src/index.ts"],"sourcesContent":["{\n \"Classic\": [\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"number\": 1\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"number\": 2\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"number\": 3\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"number\": 4\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"number\": 5\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"number\": 6\n },\n {\n \"left\": {\n \"type\": \"sea\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"sea\",\n \"crowns\": 0\n },\n \"number\": 7\n },\n {\n \"left\": {\n \"type\": \"sea\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"sea\",\n \"crowns\": 0\n },\n \"number\": 8\n },\n {\n \"left\": {\n \"type\": \"sea\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"sea\",\n \"crowns\": 0\n },\n \"number\": 9\n },\n {\n \"left\": {\n \"type\": \"plain\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"plain\",\n \"crowns\": 0\n },\n \"number\": 10\n },\n {\n \"left\": {\n \"type\": \"plain\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"plain\",\n \"crowns\": 0\n },\n \"number\": 11\n },\n {\n \"left\": {\n \"type\": \"swamp\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"swamp\",\n \"crowns\": 0\n },\n \"number\": 12\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"number\": 13\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"sea\",\n \"crowns\": 0\n },\n \"number\": 14\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"plain\",\n \"crowns\": 0\n },\n \"number\": 15\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"swamp\",\n \"crowns\": 0\n },\n \"number\": 16\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"sea\",\n \"crowns\": 0\n },\n \"number\": 17\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"plain\",\n \"crowns\": 0\n },\n \"number\": 18\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"number\": 19\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"sea\",\n \"crowns\": 0\n },\n \"number\": 20\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"plain\",\n \"crowns\": 0\n },\n \"number\": 21\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"swamp\",\n \"crowns\": 0\n },\n \"number\": 22\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"mine\",\n \"crowns\": 0\n },\n \"number\": 23\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"number\": 24\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"number\": 25\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"number\": 26\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"number\": 27\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"sea\",\n \"crowns\": 0\n },\n \"number\": 28\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"plain\",\n \"crowns\": 0\n },\n \"number\": 29\n },\n {\n \"left\": {\n \"type\": \"sea\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"number\": 30\n },\n {\n \"left\": {\n \"type\": \"sea\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"number\": 31\n },\n {\n \"left\": {\n \"type\": \"sea\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"number\": 32\n },\n {\n \"left\": {\n \"type\": \"sea\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"number\": 33\n },\n {\n \"left\": {\n \"type\": \"sea\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"number\": 34\n },\n {\n \"left\": {\n \"type\": \"sea\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"number\": 35\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"plain\",\n \"crowns\": 1\n },\n \"number\": 36\n },\n {\n \"left\": {\n \"type\": \"sea\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"plain\",\n \"crowns\": 1\n },\n \"number\": 37\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"swamp\",\n \"crowns\": 1\n },\n \"number\": 38\n },\n {\n \"left\": {\n \"type\": \"plain\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"swamp\",\n \"crowns\": 0\n },\n \"number\": 39\n },\n {\n \"left\": {\n \"type\": \"mine\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"number\": 40\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"plain\",\n \"crowns\": 2\n },\n \"number\": 41\n },\n {\n \"left\": {\n \"type\": \"sea\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"plain\",\n \"crowns\": 2\n },\n \"number\": 42\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"swamp\",\n \"crowns\": 2\n },\n \"number\": 43\n },\n {\n \"left\": {\n \"type\": \"plain\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"swamp\",\n \"crowns\": 2\n },\n \"number\": 44\n },\n {\n \"left\": {\n \"type\": \"mine\",\n \"crowns\": 2\n },\n \"right\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"number\": 45\n },\n {\n \"left\": {\n \"type\": \"swamp\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"mine\",\n \"crowns\": 2\n },\n \"number\": 46\n },\n {\n \"left\": {\n \"type\": \"swamp\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"mine\",\n \"crowns\": 2\n },\n \"number\": 47\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"mine\",\n \"crowns\": 3\n },\n \"number\": 48\n }\n ]\n}\n","import type { Domino, Ground } from \"@core/domain/types/domino.js\";\nimport type { GameMode } from \"@core/domain/types/mode.js\";\nimport type { DominoesRepository } from \"@core/portServerside/dominoesRepository.js\";\nimport dominoesJson from \"../datasources/dominoes.json\" assert { type: \"json\" };\n\nconst jsonDominoes = (): DominoesRepository => {\n const dominoes: Record<string, Domino[]> = {};\n\n for (const [key, value] of Object.entries(dominoesJson)) {\n const currentDominoes: Domino[] = [];\n value.forEach((domino) => {\n currentDominoes.push({\n left: {\n type: <Ground>domino.left.type,\n crowns: domino.left.crowns,\n },\n right: {\n type: <Ground>domino.right.type,\n crowns: domino.right.crowns,\n },\n number: domino.number,\n });\n });\n\n dominoes[key] = currentDominoes;\n }\n\n return {\n getForMode: (mode: GameMode) => {\n return dominoes[mode.name] || [];\n },\n };\n};\n\nexport default jsonDominoes;\n","[\n {\n \"name\": \"Classic\",\n \"description\": \"Original KingDomino rules\"\n }\n]","import type { GameMode } from \"@core/domain/types/mode.js\";\nimport type { ModeRepository } from \"@core/portServerside/modeRepository.js\";\nimport modesJson from \"../datasources/modes.json\" assert { type: \"json\" };\n\nconst jsonModes = (): ModeRepository => {\n const modes: GameMode[] = [];\n\n modesJson.forEach((mode) => {\n modes.push({\n name: mode.name,\n description: mode.description,\n });\n });\n\n return {\n getAvailables: () => {\n return modes;\n },\n };\n};\n\nexport default jsonModes;\n","{\n \"commun\": [\n {\n \"playersLimit\": 2,\n \"lordsPerPlayer\": 2,\n \"maxDominoes\": 24,\n \"dominoesPerTurn\": 4,\n \"maxTurns\": 6\n },\n {\n \"playersLimit\": 3,\n \"lordsPerPlayer\": 1,\n \"maxDominoes\": 36,\n \"dominoesPerTurn\": 3,\n \"maxTurns\": 12\n },\n {\n \"playersLimit\": 4,\n \"lordsPerPlayer\": 1,\n \"maxDominoes\": 48,\n \"dominoesPerTurn\": 4,\n \"maxTurns\": 12\n }\n ],\n \"extra\": [\n {\n \"name\": \"The middle Kingdom\",\n \"description\": \"Gain 10 additional points if your castle is in the middle of the kingdom.\",\n \"mode\": [{ \"name\": \"Classic\", \"description\": \"King Domino classic mode\" }]\n },\n {\n \"name\": \"Harmony\",\n \"description\": \"Gain 5 additional points if your kingdom is complete (no discarded dominoes).\",\n \"mode\": [{ \"name\": \"Classic\", \"description\": \"King Domino classic mode\" }]\n }\n ]\n}\n","import type { Rules } from \"@core/domain/types/rule.js\";\nimport type { RuleRepository } from \"@core/portServerside/ruleRepository.js\";\nimport rulesJson from \"../datasources/rules.json\" assert { type: \"json\" };\n\nconst jsonRules = (): RuleRepository => {\n const rules: Rules = {\n basic: {},\n extraRules: [],\n };\n\n const commonRules = rulesJson.commun;\n const extraRules = rulesJson.extra;\n\n commonRules.forEach((rule) => {\n rules.basic[rule.playersLimit] = {\n lords: rule.lordsPerPlayer,\n maxDominoes: rule.maxDominoes,\n dominoesPerTurn: rule.dominoesPerTurn,\n maxTurns: rule.maxTurns,\n };\n });\n\n extraRules.forEach((rule) => {\n rules.extraRules.push({\n name: rule.name,\n description: rule.description,\n mode: rule.mode,\n });\n });\n\n return {\n getAll: () => {\n return rules;\n },\n getAllExtra: () => {\n return rules.extraRules;\n },\n };\n};\n\nexport default jsonRules;\n","import type { ShuffleMethod } from \"@core/portServerside/shuffleMethod.js\";\n\nexport const shuffleMethod: ShuffleMethod = <T>(array: T[]) => {\n for (let i = array.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [array[i], array[j]] = [array[j] as T, array[i] as T];\n }\n return array;\n};\n","import type { UuidMethod } from \"@core/portServerside/uuidMethod.js\";\nimport { randomUUID } from \"crypto\";\n\nexport const uuidMethod: UuidMethod = () => {\n return randomUUID();\n};\n","import type { Logger } from \"@core/portServerside/logger.js\";\nimport winston from \"winston\";\n\nexport const winstonLogger = (isLoggingEnabled: boolean): Logger => {\n const myFormat = winston.format.printf(\n ({ level, message, label, timestamp }) => {\n return `${timestamp} [${label}] ${level}: ${message}`;\n }\n );\n\n const logger = winston.createLogger({\n level: \"info\",\n format: winston.format.combine(\n winston.format.label({ label: \"KDomino_Engine\" }),\n winston.format.timestamp(),\n winston.format.simple(),\n winston.format.json(),\n winston.format.colorize(),\n myFormat\n ),\n transports: [new winston.transports.Console()],\n });\n\n return {\n info: (message: string) => {\n if (isLoggingEnabled) {\n logger.info(message);\n }\n return void 0;\n },\n error: (message: string) => {\n if (isLoggingEnabled) {\n logger.error(message);\n }\n return void 0;\n },\n };\n};\n","export class InvalidStepError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"InvalidStepError\";\n }\n}\n\nexport class StepExecutionError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"StepExecutionError\";\n }\n}\n\nexport class ActionExecutionError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ActionExecutionError\";\n }\n}\n\nexport class NotFoundError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"NotFoundError\";\n }\n}\n","import type { Result } from \"@utils/result.js\";\nimport type { Domino, RevealsDomino } from \"./domino.js\";\nimport type { Lord } from \"./lord.js\";\nimport type { GameMode } from \"./mode.js\";\nimport type { Player, PlayerActions } from \"./player.js\";\nimport type { SelectedRules } from \"./rule.js\";\nimport type { ObjectValues } from \"./utils.js\";\n\nexport type Game = {\n id: string;\n dominoes: Domino[];\n currentDominoes: RevealsDomino[];\n players: Player[];\n lords: Lord[];\n turn: number;\n nextAction: NextAction | NextStep;\n rules: SelectedRules;\n mode: GameMode;\n};\n\nexport const gameSteps = {\n addPlayers: \"addPlayers\",\n options: \"options\",\n start: \"start\",\n result: \"result\",\n} as const;\n\nexport type GameSteps = ObjectValues<typeof gameSteps>;\n\nexport type NextAction = {\n type: \"action\";\n nextLord: string;\n nextAction: PlayerActions;\n};\n\nexport type NextStep = {\n type: \"step\";\n step: GameSteps;\n};\n\nexport type GameWithNextAction = Game & { nextAction: NextAction };\nexport type GameWithNextStep = Game & { nextAction: NextStep };\nexport type GameState = GameWithNextAction | GameWithNextStep;\nexport type GameStateResult = Result<GameState>;\n\nexport const isGameWithNextAction = (\n game: GameWithNextAction | GameWithNextStep\n): game is GameWithNextAction => {\n return game.nextAction.type === \"action\";\n};\n\nexport const isGameWithNextStep = (\n game: GameWithNextAction | GameWithNextStep\n): game is GameWithNextStep => {\n return game.nextAction.type === \"step\";\n};\n\nexport type Score = {\n points: number;\n maxPropertiesSize: number;\n totalCrowns: number;\n};\n\nexport type ScoreResult = {\n playerId: string;\n playerName: string;\n details: Score;\n};\n\nexport type FinalResult = ScoreResult & {\n position: number;\n};\n\nexport type GameWithResults = Game & { result: FinalResult[] };\n","export type Result<T> = Ok<T> | Err;\n\nexport interface Ok<T> {\n readonly tag: \"Ok\";\n readonly value: T;\n}\n\nexport interface Err {\n readonly tag: \"Err\";\n readonly error: string;\n}\n\nexport const ok = <T>(value: T): Ok<T> => ({ tag: \"Ok\", value });\nexport const err = (error: string): Err => ({ tag: \"Err\", error });\n\nexport const isOk = <T>(result: Result<T>): result is Ok<T> =>\n result.tag === \"Ok\";\nexport const isErr = <T>(result: Result<T>): result is Err =>\n result.tag === \"Err\";\n\nexport const unwrap = <T>(result: Ok<T> | Err): T => {\n if (result.tag === \"Err\") {\n throw result.error;\n }\n return result.value;\n};\n","import type { Logger } from \"@core/portServerside/logger.js\";\nimport type { AddExtraRulesCommand } from \"@application/commands/addExtraRulesCommand.js\";\nimport {\n InvalidStepError,\n StepExecutionError,\n} from \"@core/domain/errors/domainErrors.js\";\nimport {\n isGameWithNextStep,\n type GameWithNextStep,\n} from \"@core/domain/types/game.js\";\nimport type { AddExtraRulesUseCase } from \"@core/useCases/addExtraRules.js\";\nimport { isErr } from \"@utils/result.js\";\n\ntype AddExtraRulesHandler = (command: AddExtraRulesCommand) => GameWithNextStep;\n\nexport const addExtraRulesHandler =\n (logger: Logger, useCase: AddExtraRulesUseCase): AddExtraRulesHandler =>\n (command: AddExtraRulesCommand) => {\n const { game, extraRules } = command;\n logger.info(`Adding extra rules to game: ${game.id}`);\n logger.info(`Extra rules: ${extraRules}`);\n\n if (!isGameWithNextStep(game)) {\n logger.error(\n `Invalid game, required nextAction type: 'step' but got: ${game.nextAction.type}`\n );\n throw new InvalidStepError(\"Required game with nextAction type: 'step'\");\n }\n\n if (game.nextAction.step !== \"options\") {\n logger.error(\n `Required game with options step but got: ${game.nextAction.step}`\n );\n throw new InvalidStepError(\"Required game with options step\");\n }\n\n const result = useCase(game, extraRules);\n\n if (isErr(result)) {\n logger.error(`Error adding extra rules: ${result.error}`);\n throw new StepExecutionError(result.error);\n }\n\n logger.info(`Extra rules added to game: ${game.id}`);\n return result.value;\n };\n","import type { Logger } from \"@core/portServerside/logger.js\";\nimport type { AddPlayersCommand } from \"@application/commands/addPlayersCommand.js\";\nimport {\n InvalidStepError,\n StepExecutionError,\n} from \"@core/domain/errors/domainErrors.js\";\nimport {\n isGameWithNextStep,\n type GameWithNextStep,\n} from \"@core/domain/types/game.js\";\nimport type { AddPlayersUseCase } from \"@core/useCases/addPlayers.js\";\nimport { isErr } from \"@utils/result.js\";\n\ntype AddPlayersHandler = (command: AddPlayersCommand) => GameWithNextStep;\n\nexport const addPlayersHandler =\n (logger: Logger, useCase: AddPlayersUseCase): AddPlayersHandler =>\n (command: AddPlayersCommand) => {\n const { game, players } = command;\n\n logger.info(`Adding players to game: ${game.id}`);\n\n if (!isGameWithNextStep(game)) {\n logger.error(\n `Invalid game, required nextAction type: 'step' but got: ${game.nextAction.type}`\n );\n throw new InvalidStepError(\"Required game with nextAction type: 'step'\");\n }\n\n if (game.nextAction.step !== \"addPlayers\") {\n logger.error(\n `Required game with addPlayers step but got: ${game.nextAction.step}`\n );\n throw new InvalidStepError(\"Required game with addPlayers step\");\n }\n\n const result = useCase(game, players);\n\n if (isErr(result)) {\n logger.error(`Error adding players: ${result.error}`);\n throw new StepExecutionError(result.error);\n }\n\n logger.info(`Players added to game: ${game.id}`);\n return result.value;\n };\n","import type { Logger } from \"@core/portServerside/logger.js\";\nimport type { ChooseDominoCommand } from \"@application/commands/chooseDominoCommand.js\";\nimport {\n ActionExecutionError,\n InvalidStepError,\n} from \"@core/domain/errors/domainErrors.js\";\nimport {\n isGameWithNextAction,\n type GameWithNextAction,\n} from \"@core/domain/types/game.js\";\nimport type { ChooseDominoUseCase } from \"@core/useCases/chooseDomino.js\";\nimport { isErr } from \"@utils/result.js\";\n\ntype ChooseDominoHandler = (command: ChooseDominoCommand) => GameWithNextAction;\n\nexport const chooseDominoHandler =\n (logger: Logger, useCase: ChooseDominoUseCase): ChooseDominoHandler =>\n (command: ChooseDominoCommand) => {\n const { game, lordId, dominoPick } = command;\n logger.info(\n `Choosing domino: ${dominoPick} for lord: ${lordId} in game: ${game.id}`\n );\n\n if (!isGameWithNextAction(game)) {\n logger.error(\n `Invalid game, required nextAction type: 'action' but got: ${game.nextAction.type}`\n );\n throw new InvalidStepError(\n \"Required game with nextAction type: 'action'\"\n );\n }\n\n if (game.nextAction.nextAction !== \"pickDomino\") {\n logger.error(\n `Required game with pickDomino action but got: ${game.nextAction.nextAction}`\n );\n throw new InvalidStepError(\"Required game with pickDomino action\");\n }\n\n const result = useCase(game, lordId, dominoPick);\n\n if (isErr(result)) {\n logger.error(`Error choosing domino: ${result.error}`);\n throw new ActionExecutionError(result.error);\n }\n\n logger.info(\n `Domino chosen: ${dominoPick} for lord: ${lordId} in game: ${game.id}`\n );\n return result.value;\n };\n","import { StepExecutionError } from \"@core/domain/errors/domainErrors.js\";\nimport type { GameWithNextStep } from \"@core/domain/types/game.js\";\nimport type { CreateGameUseCase } from \"@core/useCases/createGame.js\";\nimport type { CreateGameCommand } from \"@application/commands/createGameCommand.js\";\nimport { isErr } from \"@utils/result.js\";\nimport type { Logger } from \"@core/portServerside/logger.js\";\n\ntype CreateGameHandler = (command: CreateGameCommand) => GameWithNextStep;\n\nexport const createGameHandler =\n (logger: Logger, useCase: CreateGameUseCase): CreateGameHandler =>\n (command: CreateGameCommand) => {\n logger.info(`Creating game with mode: ${command.mode}`);\n const result = useCase(command.mode);\n\n if (isErr(result)) {\n logger.error(`Error creating game: ${result.error}`);\n throw new StepExecutionError(result.error);\n }\n\n logger.info(`Game created: ${result.value.id}`);\n return result.value;\n };\n","import type { Logger } from \"@core/portServerside/logger.js\";\nimport type { DiscardDominoCommand } from \"@application/commands/discardDominoCommand.js\";\nimport {\n ActionExecutionError,\n InvalidStepError,\n} from \"@core/domain/errors/domainErrors.js\";\nimport {\n isGameWithNextAction,\n type GameState,\n} from \"@core/domain/types/game.js\";\nimport type { DiscardDominoUseCase } from \"@core/useCases/discardDomino.js\";\nimport { isErr } from \"@utils/result.js\";\n\ntype DiscardDominoHandler = (command: DiscardDominoCommand) => GameState;\n\nexport const discardDominoHandler =\n (logger: Logger, useCase: DiscardDominoUseCase): DiscardDominoHandler =>\n (command: DiscardDominoCommand) => {\n const { game, lordId } = command;\n logger.info(`Discarding domino for lord: ${lordId} in game: ${game.id}`);\n\n if (!isGameWithNextAction(game)) {\n logger.error(\n `Invalid game, required nextAction type: 'action' but got: ${game.nextAction.type}`\n );\n throw new InvalidStepError(\n \"Required game with nextAction type: 'action'\"\n );\n }\n\n if (game.nextAction.nextAction !== \"placeDomino\") {\n logger.error(\n `Required game with placeDomino action but got: ${game.nextAction.nextAction}`\n );\n throw new InvalidStepError(\"Required game with placeDomino action\");\n }\n\n const result = useCase(game, lordId);\n\n if (isErr(result)) {\n logger.error(`Error discarding domino: ${result.error}`);\n throw new ActionExecutionError(result.error);\n }\n\n if (isGameWithNextAction(result.value)) {\n logger.info(`Domino discarded: ${lordId} in game: ${game.id}`);\n return result.value;\n }\n\n logger.info(`Domino discarded: ${lordId} in game: ${game.id}`);\n return result.value;\n };\n","import type { Logger } from \"@core/portServerside/logger.js\";\nimport type { GetExtraRulesCommand } from \"@application/commands/getExtraRulesCommand.js\";\nimport { NotFoundError } from \"@core/domain/errors/domainErrors.js\";\nimport type { ExtraRule } from \"@core/domain/types/rule.js\";\nimport type { GetExtraRulesUseCase } from \"@core/useCases/getExtraRules.js\";\nimport { isErr } from \"@utils/result.js\";\n\ntype GetExtraRulesHandler = (command: GetExtraRulesCommand) => ExtraRule[];\n\nexport const getExtraRulesHandler =\n (logger: Logger, useCase: GetExtraRulesUseCase): GetExtraRulesHandler =>\n (command: GetExtraRulesCommand) => {\n const { mode, players } = command;\n logger.info(\n `Getting extra rules for mode: ${mode} and players: ${players}`\n );\n const result = useCase(mode, players);\n\n if (isErr(result)) {\n logger.error(`Error getting extra rules: ${result.error}`);\n throw new NotFoundError(result.error);\n }\n\n logger.info(`Extra rules retrieved: ${result.value}`);\n return result.value;\n };\n","import type { Logger } from \"@core/portServerside/logger.js\";\nimport type { GetModesCommand } from \"@application/commands/getModesCommand.js\";\nimport { NotFoundError } from \"@core/domain/errors/domainErrors.js\";\nimport type { GameMode } from \"@core/domain/types/mode.js\";\nimport type { GetModesUseCase } from \"@core/useCases/getModes.js\";\nimport { isErr } from \"@utils/result.js\";\n\ntype GetModesHandler = (command: GetModesCommand) => GameMode[];\n\nexport const getModesHandler =\n (logger: Logger, useCase: GetModesUseCase): GetModesHandler =>\n (_command: GetModesCommand) => {\n logger.info(\"Getting modes\");\n const result = useCase();\n\n if (isErr(result)) {\n logger.error(`Error getting modes: ${result.error}`);\n throw new NotFoundError(result.error);\n }\n\n logger.info(`Modes retrieved: ${result.value}`);\n return result.value;\n };\n","import type { GetResultCommand } from \"@application/commands/getResultCommand.js\";\nimport {\n InvalidStepError,\n NotFoundError,\n StepExecutionError,\n} from \"@core/domain/errors/domainErrors.js\";\nimport {\n isGameWithNextStep,\n type GameWithResults,\n type ScoreResult,\n} from \"@core/domain/types/game.js\";\nimport type { Logger } from \"@core/portServerside/logger.js\";\nimport type { CalculateScoreUseCase } from \"@core/useCases/calculateScore.js\";\nimport type { GetResultUseCase } from \"@core/useCases/getResult.js\";\nimport { isErr } from \"@utils/result.js\";\n\ntype GetResultHandler = (command: GetResultCommand) => GameWithResults;\n\nexport const getResultHandler =\n (\n logger: Logger,\n useCases: {\n getResultUseCase: GetResultUseCase;\n calculateScoreUseCase: CalculateScoreUseCase;\n }\n ): GetResultHandler =>\n (command: GetResultCommand) => {\n const { getResultUseCase, calculateScoreUseCase } = useCases;\n const { game } = command;\n logger.info(`Getting result for game: ${game.id}`);\n\n if (!isGameWithNextStep(game)) {\n logger.error(\n `Invalid game, required nextAction type: 'step' but got: ${game.nextAction.type}`\n );\n throw new InvalidStepError(\"Required game with nextAction type: 'step'\");\n }\n\n if (game.nextAction.step !== \"result\") {\n logger.error(\n `Required game with result step but got: ${game.nextAction.step}`\n );\n throw new InvalidStepError(\"Required game with result step\");\n }\n\n let scoreResult: ScoreResult[];\n const { players } = game;\n\n scoreResult = players.map((player) => {\n const { kingdom } = player;\n const result = calculateScoreUseCase(kingdom);\n\n if (isErr(result)) {\n logger.error(`Error when calculating score: ${result.error}`);\n throw new StepExecutionError(result.error);\n }\n\n return {\n playerId: player.id,\n playerName: player.name,\n details: {\n ...result.value,\n },\n };\n });\n\n const result = getResultUseCase(game, scoreResult);\n\n if (isErr(result)) {\n logger.error(`Error getting result: ${result.error}`);\n throw new NotFoundError(result.error);\n }\n\n logger.info(`Result retrieved for game: ${game.id}`);\n return result.value;\n };\n","import type { Logger } from \"@core/portServerside/logger.js\";\nimport type { PlaceDominoCommand } from \"@application/commands/placeDominoCommand.js\";\nimport {\n ActionExecutionError,\n InvalidStepError,\n} from \"@core/domain/errors/domainErrors.js\";\nimport {\n isGameWithNextAction,\n type GameState,\n} from \"@core/domain/types/game.js\";\nimport type { PlaceDominoUseCase } from \"@core/useCases/placeDomino.js\";\nimport { isErr } from \"@utils/result.js\";\n\ntype PlaceDominoHandler = (command: PlaceDominoCommand) => GameState;\n\nexport const placeDominoHandler =\n (logger: Logger, useCase: PlaceDominoUseCase): PlaceDominoHandler =>\n (command: PlaceDominoCommand) => {\n const { game, lordId, position, rotation } = command;\n logger.info(\n `Placing domino: ${lordId} in position: ${JSON.stringify(\n position\n )} with rotation: ${rotation} in game: ${\n game.id\n }`\n );\n\n if (!isGameWithNextAction(game)) {\n logger.error(\n `Invalid game, required nextAction type: 'action' but got: ${game.nextAction.type}`\n );\n throw new InvalidStepError(\n \"Required game with nextAction type: 'action'\"\n );\n }\n\n if (game.nextAction.nextAction !== \"placeDomino\") {\n logger.error(\n `Required game with placeDomino action but got: ${game.nextAction.nextAction}`\n );\n throw new InvalidStepError(\"Required game with placeDomino step\");\n }\n\n const result = useCase(game, lordId, position, rotation);\n\n if (isErr(result)) {\n logger.error(`Error placing domino: ${result.error}`);\n throw new ActionExecutionError(result.error);\n }\n\n if (isGameWithNextAction(result.value)) {\n logger.info(\n `Domino placed: ${lordId} in position: ${JSON.stringify(\n position\n )} with rotation: ${rotation} in game: ${\n game.id\n }`\n );\n return result.value;\n }\n\n logger.info(\n `Domino placed: ${lordId} in position: ${JSON.stringify(\n position\n )} with rotation: ${rotation} in game: ${\n game.id\n }`\n );\n return result.value;\n };\n","import type { Logger } from \"@core/portServerside/logger.js\";\nimport type { StartGameCommand } from \"@application/commands/startGameCommand.js\";\nimport {\n InvalidStepError,\n StepExecutionError,\n} from \"@core/domain/errors/domainErrors.js\";\nimport {\n isGameWithNextStep,\n type GameWithNextAction,\n} from \"@core/domain/types/game.js\";\nimport type { StartGameUseCase } from \"@core/useCases/startGame.js\";\nimport { isErr } from \"@utils/result.js\";\n\ntype StartGameHandler = (command: StartGameCommand) => GameWithNextAction;\n\nexport const startGameHandler =\n (logger: Logger, useCase: StartGameUseCase): StartGameHandler =>\n (command: StartGameCommand) => {\n const { game } = command;\n logger.info(`Starting game: ${game.id}`);\n\n if (!isGameWithNextStep(game)) {\n logger.error(\n `Invalid game, required nextAction type: 'step' but got: ${game.nextAction.type}`\n );\n throw new InvalidStepError(\"Required game with nextAction type: 'step'\");\n }\n\n if (\n game.nextAction.step !== \"start\" &&\n game.nextAction.step !== \"options\"\n ) {\n logger.error(\n `Required game with start step or options step but got: ${game.nextAction.step}`\n );\n throw new InvalidStepError(\n \"Required game with start step or options step\"\n );\n }\n\n const result = useCase(game);\n\n if (isErr(result)) {\n logger.error(`Error starting game: ${result.error}`);\n throw new StepExecutionError(result.error);\n }\n\n logger.info(`Game started: ${game.id}`);\n return result.value;\n };\n","import type { CalculateScoreCommand } from \"@application/commands/calculateScoreCommand.js\";\nimport type { Score } from \"@core/domain/types/game.js\";\nimport type { Logger } from \"@core/portServerside/logger.js\";\nimport type { CalculateScoreUseCase } from \"@core/useCases/calculateScore.js\";\nimport { isErr } from \"@utils/result.js\";\n\ntype CalculateScoreHandler = (command: CalculateScoreCommand) => Score;\n\nexport const calculateScoreHandler =\n (logger: Logger, useCase: CalculateScoreUseCase): CalculateScoreHandler =>\n (command) => {\n const { kingdom } = command;\n logger.info(`Calculating score for kingdom`);\n const result = useCase(kingdom);\n\n if (isErr(result)) {\n logger.error(`Error calculating score: ${result.error}`);\n throw new Error(result.error);\n }\n\n logger.info(`Score calculated: ${result.value}`);\n return result.value;\n };\n","import type { EmptyTile, Tile } from \"./domino.js\";\n\nexport type Position = {\n x: number; // cols\n y: number; // rows\n};\n\nexport type Rotation = 0 | 90 | 180 | 270;\n\nexport type Kingdom = (Tile | EmptyTile)[][];\n\nexport const GRIDSIZE = 9;\n","export const GROUND = [\n \"castle\",\n \"wheat\",\n \"forest\",\n \"sea\",\n \"plain\",\n \"swamp\",\n \"mine\",\n] as const;\n\nexport type Ground = (typeof GROUND)[number];\nexport type EmptyGround = \"empty\";\n\nexport type Crown = number;\n\nexport type Tile = {\n type: Ground;\n crowns: Crown;\n};\n\nexport type EmptyTile = {\n type: EmptyGround;\n crowns: 0;\n};\n\nexport type Domino = {\n left: Tile;\n right: Tile;\n number: number;\n};\n\nexport type RevealsDomino = {\n domino: Domino;\n picked: boolean;\n lordId: string | null;\n position: number;\n};\n","import type { Kingdom } from \"./kingdom.js\";\nimport type { ObjectValues } from \"./utils.js\";\n\nexport type Player = {\n id: string;\n name: string;\n kingdom: Kingdom;\n};\n\nexport type PlayerPayload = {\n name: string;\n};\n\nexport type PlayersPayload = PlayerPayload[];\n\nexport type Players = Player[];\n\nexport const playerActions = {\n placeDomino: \"placeDomino\",\n pickDomino: \"pickDomino\",\n pass: \"pass\",\n} as const;\n\nexport type PlayerActions = ObjectValues<typeof playerActions>;\n","import type { ExtraRule } from \"@core/domain/types/rule.js\";\nimport { ok, err, type Result } from \"@utils/result.js\";\n\nexport const getAvailablesExtraRules = (\n extraRules: ExtraRule[],\n mode: string,\n numberOfPlayers: number\n): Result<ExtraRule[]> => {\n const availableExtraRules = extraRules.filter((rule) => {\n return (\n rule.mode.filter((m) => m.name === mode).length > 0 &&\n (!rule.playersLimit || rule.playersLimit === numberOfPlayers)\n );\n });\n\n if (availableExtraRules.length === 0) {\n return err(\"No extra rules found\");\n }\n\n return ok(availableExtraRules);\n};\n\nexport const toExtraRule = (\n rule: string,\n extraRules: ExtraRule[]\n): Result<ExtraRule> => {\n const foundRule = extraRules.find((r) => r.name === rule);\n\n if (!foundRule) {\n return err(`Rule not found: ${rule}`);\n }\n\n return ok(foundRule);\n};\n","import {\n gameSteps,\n type ExtraRule,\n type GameWithNextStep,\n type NextStep,\n} from \"@core/domain/types/index.js\";\nimport { isErr, ok, type Result } from \"@utils/result.js\";\nimport type { RuleRepository } from \"@core/portServerside/ruleRepository.js\";\nimport { toExtraRule } from \"@core/domain/entities/rule.js\";\n\nexport type AddExtraRulesUseCase = (\n game: GameWithNextStep,\n rules: string[]\n) => Result<GameWithNextStep>;\n\nexport const addExtraRulesUseCase =\n (deps: { ruleRepository: RuleRepository }): AddExtraRulesUseCase =>\n (game, rules) => {\n const { ruleRepository } = deps;\n const availableExtraRules = ruleRepository.getAllExtra();\n\n const newExtraRules: ExtraRule[] = [];\n\n for (const rule of rules) {\n const result = toExtraRule(rule, availableExtraRules);\n\n if (isErr(result)) {\n return result;\n }\n\n newExtraRules.push(result.value);\n }\n\n const updatedRules = {\n basic: game.rules.basic,\n extra: newExtraRules,\n };\n\n const next: NextStep = {\n type: \"step\",\n step: gameSteps.start,\n };\n\n const updatedGame: GameWithNextStep = {\n ...game,\n rules: updatedRules,\n nextAction: next,\n };\n\n return ok(updatedGame);\n };\n","import {\n GROUND,\n type Crown,\n type EmptyGround,\n type EmptyTile,\n type Ground,\n type Tile,\n} from \"@core/domain/types/domino.js\";\n\nconst isGround = (ground: any): ground is Ground => {\n return GROUND.includes(ground);\n};\n\nexport const createTile = (\n ground: Ground | EmptyGround,\n crowns: Crown = 0\n): Tile | EmptyTile => {\n if (isGround(ground)) {\n return { type: ground, crowns } as Tile;\n }\n return { type: ground, crowns: 0 } as EmptyTile;\n};\n","import {\n type Domino,\n type EmptyTile,\n GRIDSIZE,\n type Kingdom,\n type Position,\n type Rotation,\n type Tile,\n} from \"@core/domain/types/index.js\";\nimport {err, isErr, isOk, ok, type Result} from \"@utils/result.js\";\nimport {createTile} from \"./domino.js\";\n\nexport const createEmptyKingdom = (): Kingdom => {\n const emptyTile = createTile(\"empty\");\n return Array.from({length: GRIDSIZE}, () =>\n Array.from({length: GRIDSIZE}, () => emptyTile)\n );\n};\n\nexport const placeCastle = (kingdom: Kingdom): Kingdom => {\n const castle = createTile(\"castle\");\n const newKingdom = deepCopyKingdom(kingdom);\n newKingdom[4]![4] = castle;\n return newKingdom;\n};\n\nexport const placeTile = (\n kingdom: Kingdom,\n position: Position,\n tile: Tile\n): Kingdom => {\n const newKingdom = deepCopyKingdom(kingdom);\n newKingdom[position.y]![position.x] = tile;\n return newKingdom;\n};\n\nexport const getTile = (\n kingdom: Kingdom,\n position: Position\n): Result<Tile | EmptyTile> => {\n const tile = kingdom[position.y]?.[position.x];\n if (!tile) {\n return err(\"Invalid placement (not fit into the grid)\");\n }\n return ok(tile);\n};\n\nexport const calculateDominoPosition = (\n position: Position,\n rotation: Rotation,\n domino: Domino\n): [{ tile: Tile; position: Position }, { tile: Tile; position: Position }] => {\n let firstTile: {\n tile: Tile;\n position: Position;\n };\n let secondTile: {\n tile: Tile;\n position: Position;\n };\n\n switch (rotation) {\n case 0: // horizontal, left to right\n firstTile = {\n tile: domino.left,\n position: {\n x: position.x,\n y: position.y,\n },\n };\n secondTile = {\n tile: domino.right,\n position: {\n x: position.x + 1,\n y: position.y,\n },\n };\n break;\n case 90: // vertical, top to bottom\n firstTile = {\n tile: domino.left,\n position: {\n x: position.x,\n y: position.y,\n },\n };\n secondTile = {\n tile: domino.right,\n position: {\n x: position.x,\n y: position.y + 1,\n },\n };\n break;\n case 180: // horizontal, right to left\n firstTile = {\n tile: domino.right,\n position: {\n x: position.x,\n y: position.y,\n },\n };\n secondTile = {\n tile: domino.left,\n position: {\n x: position.x + 1,\n y: position.y,\n },\n };\n break;\n case 270: // vertical, bottom to top\n firstTile = {\n tile: domino.right,\n position: {\n x: position.x,\n y: position.y,\n },\n };\n secondTile = {\n tile: domino.left,\n position: {\n x: position.x,\n y: position.y + 1,\n },\n };\n break;\n }\n\n return [firstTile, secondTile];\n};\n\nexport const placeDomino = (\n kingdom: Kingdom,\n position: Position,\n rotation: Rotation,\n domino: Domino\n): Result<Kingdom> => {\n const [firstTile, secondTile] = calculateDominoPosition(\n position,\n rotation,\n domino\n );\n\n const isFreePlaceResult = isFreePlace(\n kingdom,\n firstTile.position,\n secondTile.position\n );\n if (isErr(isFreePlaceResult)) {\n return isFreePlaceResult;\n }\n\n const adjacentTiles = isAdjacent(\n kingdom,\n firstTile.position,\n secondTile.position\n );\n\n if (adjacentTiles.length === 0) {\n return err(\"Invalid placement (not adjacent)\");\n }\n\n const hasValidAdjacentTiles = hasValidAdjacent(adjacentTiles, [\n firstTile.tile,\n secondTile.tile,\n ]);\n\n if (!hasValidAdjacentTiles) {\n return err(\"Invalid placement (not valid adjacent)\");\n }\n\n return ok(placeTiles(kingdom, [firstTile, secondTile]));\n};\n\nconst placeTiles = (\n kingdom: Kingdom,\n tiles: { tile: Tile; position: Position }[]\n) => {\n let newKingdom = deepCopyKingdom(kingdom);\n for (const { tile, position } of tiles) {\n newKingdom = placeTile(newKingdom, position, tile);\n }\n return newKingdom;\n};\n\nconst isFreePlace = (\n kingdom: Kingdom,\n firstPosition: Position,\n secondPosition: Position\n): Result<boolean> => {\n const firstTile = getTile(kingdom, firstPosition);\n const secondTile = getTile(kingdom, secondPosition);\n\n if (isErr(firstTile)) {\n return firstTile;\n }\n\n if (isErr(secondTile)) {\n return secondTile;\n }\n\n if (firstTile.value.type !== \"empty\" || secondTile.value.type !== \"empty\") {\n return err(\"Invalid placement (not empty)\");\n }\n\n return ok(true);\n};\n\nconst isAdjacent = (\n kingdom: Kingdom,\n firstPosition: Position,\n secondPosition: Position\n): Tile[] => {\n const xFirstPosition = firstPosition.x;\n const yFirstPosition = firstPosition.y;\n const xSecondPosition = secondPosition.x;\n const ySecondPosition = secondPosition.y;\n\n const adjacentTiles: Tile[] = [];\n const adjacentTilesKeys = [\n { x: xFirstPosition - 1, y: yFirstPosition },\n { x: xFirstPosition, y: yFirstPosition - 1 },\n { x: xFirstPosition + 1, y: yFirstPosition },\n { x: xFirstPosition, y: yFirstPosition + 1 },\n { x: xSecondPosition - 1, y: ySecondPosition },\n { x: xSecondPosition, y: ySecondPosition - 1 },\n { x: xSecondPosition + 1, y: ySecondPosition },\n { x: xSecondPosition, y: ySecondPosition + 1 },\n ];\n\n // Remove firstPosition and secondPosition from adjacentTilesKeys\n adjacentTilesKeys.splice(\n adjacentTilesKeys.findIndex((pos) => {\n return pos.x === xFirstPosition && pos.y === yFirstPosition;\n }),\n 1\n );\n\n adjacentTilesKeys.splice(\n adjacentTilesKeys.findIndex((pos) => {\n return pos.x === xSecondPosition && pos.y === ySecondPosition;\n }),\n 1\n );\n\n adjacentTilesKeys.forEach((key) => {\n const tile = getTile(kingdom, key);\n if (isOk(tile)) {\n if (tile.value.type !== \"empty\") {\n adjacentTiles.push(tile.value);\n }\n }\n });\n\n return adjacentTiles;\n};\n\nconst hasValidAdjacent = (\n adjacentTiles: (Tile | EmptyTile)[],\n tiles: Tile[]\n): boolean => {\n return adjacentTiles.some((adjacentTile) => {\n return tiles.some((tile) => {\n return tile.type === adjacentTile.type || adjacentTile.type === \"castle\";\n });\n });\n};\n\nexport const checkCastleIsInMiddle = (kingdom: Kingdom): boolean => {\n // Find index of castle\n const castlePosition = kingdom\n .map((row) => row.findIndex((tile) => tile.type === \"castle\"))\n .find((index) => index !== -1);\n\n // Count how many tiles not empty are on the left of the castle\n const leftTiles =\n castlePosition !== undefined\n ? kingdom[castlePosition]!.slice(0, castlePosition)\n : [];\n const leftTilesCount = leftTiles.filter(\n (tile) => tile.type !== \"empty\"\n ).length;\n\n // Count how many tiles not empty are on the right of the castle\n const rightTiles =\n castlePosition !== undefined\n ? kingdom[castlePosition]!.slice(castlePosition + 1)\n : [];\n const rightTilesCount = rightTiles.filter(\n (tile) => tile.type !== \"empty\"\n ).length;\n\n // Count how many tiles not empty are on the top of the castle\n const topTiles =\n castlePosition !== undefined\n ? kingdom[castlePosition]!.slice(0, castlePosition)\n : [];\n const topTilesCount = topTiles.filter((tile) => tile.type !== \"empty\").length;\n\n // Count how many tiles not empty are on the bottom of the castle\n const bottomTiles =\n castlePosition != undefined\n ? kingdom[castlePosition]!.slice(castlePosition + 1)\n : [];\n const bottomTilesCount = bottomTiles.filter(\n (tile) => tile.type !== \"empty\"\n ).length;\n\n return (\n leftTilesCount === rightTilesCount &&\n topTilesCount === bottomTilesCount &&\n leftTilesCount === topTilesCount\n );\n};\n\nexport const countDominoes = (kingdom: Kingdom): number => {\n const notEmpties = kingdom.flat().filter((tile) => tile.type !== \"empty\");\n // -1 because the castle is not a domino\n return (notEmpties.length - 1) / 2;\n};\n\nconst deepCopyKingdom = (kingdom: Kingdom): Kingdom => {\n return kingdom.map((line) => line.map((tile) => ({ ...tile })));\n};\n","import { type Result, err, ok, isErr } from \"@utils/result.js\";\nimport type { Player } from \"@core/domain/types/player.js\";\nimport type { Kingdom } from \"@core/domain/types/kingdom.js\";\n\nconst MINPLAYERSNAMELENGTH = 3;\n\nexport const validatePlayer = (name: string): Result<string> => {\n if (!name || name.trim().length < MINPLAYERSNAMELENGTH) {\n return err(`Invalid player name: ${name}`);\n }\n\n return ok(name);\n};\n\nexport const createPlayer = (\n playerName: string,\n id: string,\n kingdom: Kingdom\n): Result<Player> => {\n const name = validatePlayer(playerName);\n\n if (isErr(name)) {\n return name;\n }\n\n return ok({\n name: name.value,\n id,\n kingdom,\n });\n};\n","import {\n createEmptyKingdom,\n placeCastle,\n} from \"@core/domain/entities/kingdom.js\";\nimport { createPlayer } from \"@core/domain/entities/player.js\";\nimport type {\n GameWithNextStep,\n NextStep,\n Players,\n} from \"@core/domain/types/index.js\";\nimport type { RuleRepository } from \"@core/portServerside/ruleRepository.js\";\nimport type { ShuffleMethod } from \"@core/portServerside/shuffleMethod.js\";\nimport type { UuidMethod } from \"@core/portServerside/uuidMethod.js\";\nimport { err, isErr, ok, type Result } from \"@utils/result.js\";\n\nexport type AddPlayersUseCase = (\n game: GameWithNextStep,\n players: string[]\n) => Result<GameWithNextStep>;\n\nexport const addPlayersUseCase =\n (deps: {\n uuidMethod: UuidMethod;\n shuffleMethod: ShuffleMethod;\n ruleRepository: RuleRepository;\n }): AddPlayersUseCase =>\n (game, players) => {\n const { uuidMethod, shuffleMethod, ruleRepository } = deps;\n\n if (!players || players.length < 2 || players.length > 4) {\n return err(\"Invalid number of players\");\n }\n\n const newPlayers: Players = [];\n\n for (const player of players) {\n let kingdom = createEmptyKingdom();\n kingdom = placeCastle(kingdom);\n let id = uuidMethod();\n const newPlayer = createPlayer(player, id, kingdom);\n\n if (isErr(newPlayer)) {\n return newPlayer;\n }\n\n newPlayers.push(newPlayer.value);\n }\n\n // set rules\n const rules = ruleRepository.getAll();\n const basicRules = rules.basic[newPlayers.length];\n\n if (!basicRules) {\n return err(\"No base rules found\");\n }\n\n // updateDominoes\n const dominoes = game.dominoes;\n const { maxDominoes } = basicRules;\n const shuffledDominoes = shuffleMethod(dominoes);\n const splicedDominoes = shuffledDominoes.slice(0, maxDominoes);\n const next: NextStep = {\n type: \"step\",\n step: \"options\",\n };\n\n const updatedGame: GameWithNextStep = {\n ...game,\n players: newPlayers,\n dominoes: splicedDominoes,\n rules: {\n ...game.rules,\n basic: basicRules,\n },\n nextAction: next,\n };\n\n return ok(updatedGame);\n };\n","import type { NextAction } from \"@core/domain/types/game.js\";\nimport type { Lord } from \"@core/domain/types/lord.js\";\nimport { playerActions } from \"@core/domain/types/player.js\";\n\nexport const createLord = (id: string, playerId: string): Lord => {\n return {\n id,\n playerId,\n turnEnded: false,\n hasPick: false,\n hasPlace: true,\n };\n};\n\nconst hasPick = (lord: Lord): boolean => lord.hasPick;\nconst hasPlace = (lord: Lord): boolean => lord.hasPlace;\nconst hasTurnEnded = (lord: Lord): boolean => lord.turnEnded;\n\nexport const canPass = (lord: Lord): boolean => {\n return !hasPick(lord) && !hasPlace(lord) && !hasTurnEnded(lord);\n};\n\nexport const canPick = (lord: Lord): boolean => {\n return !hasPick(lord) && hasPlace(lord) && !hasTurnEnded(lord);\n};\n\nexport const canPlaceAndDominoPickedIsDefined = (\n lord: Lord\n): lord is Required<Lord & Pick<Lord, \"dominoPicked\">> => {\n return (\n !hasPick(lord) &&\n !hasPlace(lord) &&\n !hasTurnEnded(lord) &&\n lord.dominoPicked !== undefined\n );\n};\n\nexport const updateLordOrder = (lords: Lord[]): Lord[] => {\n return lords.sort((a, b) => {\n return a.dominoPicked!.number - b.dominoPicked!.number;\n });\n};\n\nexport const resetLordsActions = (lord: Lord[]): Lord[] => {\n const lordsCopy = [...lord];\n for (const lord of lordsCopy) {\n lord.turnEnded = false;\n lord.hasPick = false;\n lord.hasPlace = false;\n }\n\n return lordsCopy;\n};\n\nexport const nextLordWithAction = (lords: Lord[]): NextAction => {\n const nextLord = findNextLord(lords);\n\n return {\n type: \"action\",\n nextLord: nextLord.id,\n nextAction: hasPlace(nextLord)\n ? playerActions.pickDomino\n : playerActions.placeDomino,\n };\n};\n\nconst findNextLord = (lords: Lord[]): Lord => {\n const lord = lords.find((lord) => !hasTurnEnded(lord));\n if (!lord) {\n return lords[0]!;\n }\n return lord;\n};\n\nexport const allLordsHavePlayed = (lords: Lord[]) => {\n return lords.every((lord) => lord.turnEnded);\n};\n","import {\n allLordsHavePlayed,\n canPick,\n nextLordWithAction,\n resetLordsActions,\n updateLordOrder,\n} from \"@core/domain/entities/lord.js\";\nimport type { GameWithNextAction } from \"@core/domain/types/game.js\";\nimport { err, ok, type Result } from \"@utils/result.js\";\n\nexport type ChooseDominoUseCase = (\n game: GameWithNextAction,\n lordId: string,\n dominoPick: number\n) => Result<GameWithNextAction>;\n\nexport const chooseDominoUseCase: ChooseDominoUseCase = (\n game,\n lordId,\n dominoPick\n) => {\n const currentLord = game.lords.find(\n (lord) => lord.id === game.nextAction.nextLord\n );\n\n if (!currentLord) {\n return err(\"Lord not found\");\n }\n\n if (currentLord.id !== lordId) {\n return err(\"Not your turn\");\n }\n\n if (!canPick(currentLord)) {\n return err(\"Lord can't pick\");\n }\n\n // Check if dominoPick is valid choice\n const selectedDomino = game.currentDominoes.find(\n (domino) => domino.domino.number === dominoPick\n );\n\n if (!selectedDomino) {\n return err(\"Domino not found\");\n }\n\n if (selectedDomino.picked) {\n return err(\"Domino already picked\");\n }\n\n // update currentDominoes\n const updatedCurrentDominoes = game.currentDominoes.map((domino) => {\n if (domino.domino.number === dominoPick) {\n domino.picked = true;\n domino.lordId = currentLord.id;\n }\n return domino;\n });\n\n // update lords\n const updatedLords = game.lords.map((lord) => {\n if (lord.id === currentLord.id) {\n lord.hasPick = true;\n lord.turnEnded = true;\n lord.dominoPicked = selectedDomino.domino;\n }\n return lord;\n });\n\n const turnEnded = allLordsHavePlayed(updatedLords);\n\n if (turnEnded) {\n const lords = resetLordsActions(updateLordOrder(updatedLords));\n const updatedTurn = game.turn + 1;\n const next = nextLordWithAction(lords);\n const dominoesCopy = [...game.dominoes];\n const dominoesDrawn = dominoesCopy.splice(\n 0,\n game.rules.basic.dominoesPerTurn\n );\n dominoesDrawn.sort((a, b) => a.number - b.number);\n const updatedCurrentDominoes = dominoesDrawn.map((domino, index) => {\n return {\n domino,\n picked: false,\n lordId: null,\n position: index + 1,\n };\n });\n\n return ok({\n ...game,\n currentDominoes: updatedCurrentDominoes,\n dominoes: dominoesCopy,\n lords,\n turn: updatedTurn,\n nextAction: next,\n });\n }\n\n const next = nextLordWithAction(updatedLords);\n\n // update state\n const updatedState = {\n ...game,\n currentDominoes: updatedCurrentDominoes,\n lords: updatedLords,\n nextAction: next,\n };\n\n return ok(updatedState);\n};\n","import {\n gameSteps,\n type Domino,\n type GameMode,\n type GameWithNextStep,\n} from \"@core/domain/types/index.js\";\n\nexport const create = (payload: {\n id: string;\n mode: GameMode;\n dominoes: Domino[];\n}): GameWithNextStep => {\n const { id, mode, dominoes } = payload;\n return {\n id,\n dominoes,\n currentDominoes: [],\n players: [],\n lords: [],\n turn: 0,\n nextAction: {\n type: \"step\",\n step: gameSteps.addPlayers,\n },\n rules: {\n basic: {\n lords: 0,\n maxDominoes: 0,\n dominoesPerTurn: 0,\n maxTurns: 0,\n },\n extra: [],\n },\n mode,\n };\n};\n","import { err, ok, type Result } from \"@utils/result.js\";\nimport type { GameMode } from \"@core/domain/types/mode.js\";\n\nconst findMode = (\n mode: string,\n availableMode: GameMode[]\n): GameMode | undefined => {\n return availableMode.find((m) => m.name === mode);\n};\n\nexport const createMode = (\n mode: string,\n availableMode: GameMode[]\n): Result<GameMode> => {\n const foundMode = findMode(mode, availableMode);\n if (foundMode) {\n return ok(foundMode);\n }\n\n return err(`Invalid mode: ${mode}`);\n};\n","import { create } from \"@core/domain/entities/game.js\";\nimport { createMode } from \"@core/domain/entities/mode.js\";\nimport type { GameWithNextStep } from \"@core/domain/types/game.js\";\nimport type { DominoesRepository } from \"@core/portServerside/dominoesRepository.js\";\nimport type { ModeRepository } from \"@core/portServerside/modeRepository.js\";\nimport type { UuidMethod } from \"@core/portServerside/uuidMethod.js\";\nimport { err, isErr, ok, type Result } from \"@utils/result.js\";\n\nexport type CreateGameUseCase = (mode: string) => Result<GameWithNextStep>;\n\nexport const createGameUseCase =\n (deps: {\n modeRepository: ModeRepository;\n dominoesRepository: DominoesRepository;\n uuidMethod: UuidMethod;\n }): CreateGameUseCase =>\n (mode) => {\n const { modeRepository, dominoesRepository, uuidMethod } = deps;\n const id = uuidMethod();\n const availableMode = modeRepository.getAvailables();\n const newMode = createMode(mode, availableMode);\n\n if (isErr(newMode)) {\n return newMode;\n }\n\n const dominoes = dominoesRepository.getForMode(newMode.value);\n\n if (!dominoes || dominoes.length === 0) {\n return err(`No dominoes found for mode ${newMode.value.name}`);\n }\n\n const payload = {\n id,\n mode: newMode.value,\n dominoes,\n };\n\n const newGame = create(payload);\n\n return ok(newGame);\n };\n","import {\n allLordsHavePlayed,\n canPass,\n nextLordWithAction,\n} from \"@core/domain/entities/lord.js\";\nimport {\n gameSteps,\n type GameState,\n type GameStateResult,\n type GameWithNextAction,\n type NextAction,\n type NextStep,\n} from \"@core/domain/types/game.js\";\nimport { err, ok } from \"@utils/result.js\";\n\nexport type DiscardDominoUseCase = (\n game: GameWithNextAction,\n lordId: string\n) => GameStateResult;\n\nexport const discardDominoUseCase: DiscardDominoUseCase = (game, lordId) => {\n const nextAction = game.nextAction;\n\n const currentLord = game.lords.find(\n (lord) => lord.id === nextAction.nextLord\n );\n\n if (!currentLord) {\n return err(\"Lord not found\");\n }\n\n if (currentLord.id !== lordId) {\n return err(\"Not your turn\");\n }\n\n if (!canPass(currentLord)) {\n return err(\"Lord can't pass\");\n }\n\n const maxTurns = game.rules.basic.maxTurns;\n const currentTurn = game.turn;\n const isLastTurn = currentTurn === maxTurns;\n\n const updatedLord = game.lords.map((lord) => {\n if (lord.id === currentLord.id) {\n if (isLastTurn) {\n return {\n ...lord,\n turnEnded: true,\n hasPlace: true,\n };\n }\n\n return {\n ...lord,\n hasPlace: true,\n };\n }\n return lord;\n });\n\n let updatedGame: GameState;\n\n const resultStep: NextStep = {\n type: \"step\",\n step: gameSteps.result,\n };\n\n if (isLastTurn && allLordsHavePlayed(updatedLord)) {\n updatedGame = {\n ...game,\n lords: updatedLord,\n nextAction: resultStep,\n };\n } else {\n updatedGame = {\n ...game,\n lords: updatedLord,\n nextAction: <NextAction>nextLordWithAction(updatedLord),\n };\n }\n\n return ok(updatedGame);\n};\n","import { getAvailablesExtraRules } from \"@core/domain/entities/rule.js\";\nimport type { GameMode } from \"@core/domain/types/mode.js\";\nimport type { ExtraRule } from \"@core/domain/types/rule.js\";\nimport type { RuleRepository } from \"@core/portServerside/ruleRepository.js\";\nimport { err, type Result } from \"@utils/result.js\";\n\nexport type GetExtraRulesUseCase = (\n mode: GameMode[\"name\"],\n players: number\n) => Result<ExtraRule[]>;\n\nexport const getExtraRulesUseCase =\n (deps: { ruleRepository: RuleRepository }): GetExtraRulesUseCase =>\n (mode: GameMode[\"name\"], players: number): Result<ExtraRule[]> => {\n const { ruleRepository } = deps;\n\n const allExtraRules = ruleRepository.getAllExtra();\n\n if (!allExtraRules) {\n return err(\"No rules found\");\n }\n\n return getAvailablesExtraRules(allExtraRules, mode, players);\n };\n","import type { GameMode } from \"@core/domain/types/mode.js\";\nimport type { ModeRepository } from \"@core/portServerside/modeRepository.js\";\nimport { ok, type Result } from \"@utils/result.js\";\n\nexport type GetModesUseCase = () => Result<GameMode[]>;\n\nexport const getModesUseCase =\n (deps: { modeRepository: ModeRepository }): GetModesUseCase =>\n (): Result<GameMode[]> => {\n const { modeRepository } = deps;\n return ok(modeRepository.getAvailables());\n };\n","import {\n checkCastleIsInMiddle,\n countDominoes,\n} from \"@core/domain/entities/kingdom.js\";\nimport type {\n FinalResult,\n GameWithNextStep,\n GameWithResults,\n ScoreResult,\n} from \"@core/domain/types/index.js\";\nimport { ok, type Result } from \"@utils/result.js\";\n\nexport type GetResultUseCase = (\n game: GameWithNextStep,\n scoreResult: ScoreResult[]\n) => Result<GameWithResults>;\n\nexport const getResultUseCase: GetResultUseCase = (game, scoreResult) => {\n const { rules } = game;\n const { basic, extra } = rules;\n\n const finalScoreResult = scoreResult.map((score): ScoreResult => {\n let finalScore = score.details.points;\n\n const kingdom = game.players.find((player) => {\n if (player.id === score.playerId) {\n return player;\n }\n })?.kingdom!;\n\n if (extra.length > 0) {\n extra.forEach((extraRule) => {\n if (extraRule.name === \"The middle Kingdom\") {\n const castleIsInMiddle = checkCastleIsInMiddle(kingdom);\n if (castleIsInMiddle) {\n finalScore += 10;\n }\n }\n\n if (extraRule.name === \"Harmony\") {\n const totalDominoes = countDominoes(kingdom);\n const dominoLimit = basic.maxDominoes;\n const totalPlayers = game.players.length;\n const dominoesPerPlayer = dominoLimit / totalPlayers;\n if (totalDominoes === dominoesPerPlayer) {\n finalScore += 5;\n }\n }\n });\n }\n\n return {\n ...score,\n details: {\n ...score.details,\n points: finalScore,\n },\n };\n });\n\n // 1 order players by score, then by maxPropertiesSize, then by totalCrowns all descending\n finalScoreResult.sort((a, b) => {\n if (a.details.points !== b.details.points) {\n return b.details.points - a.details.points;\n }\n if (a.details.maxPropertiesSize !== b.details.maxPropertiesSize) {\n return b.details.maxPropertiesSize - a.details.maxPropertiesSize;\n }\n return b.details.totalCrowns - a.details.totalCrowns;\n });\n\n const result: FinalResult[] = [];\n\n let isTie = false;\n result.push({\n playerId: finalScoreResult[0]!.playerId,\n playerName: finalScoreResult[0]!.playerName,\n details: finalScoreResult[0]!.details,\n position: 1,\n });\n\n for (let i = 1; i < finalScoreResult.length; i++) {\n const currentScore = finalScoreResult[i];\n const previousScore = finalScoreResult[i - 1];\n if (\n previousScore &&\n currentScore &&\n currentScore.details.points === previousScore.details.points &&\n currentScore.details.maxPropertiesSize ===\n previousScore.details.maxPropertiesSize &&\n currentScore.details.totalCrowns === previousScore.details.totalCrowns\n ) {\n isTie = true;\n }\n\n if (isTie) {\n result.push({\n ...currentScore!,\n position: result[i - 1]!.position,\n });\n } else {\n result.push({\n ...currentScore!,\n position: i + 1,\n });\n }\n\n isTie = false;\n }\n\n return ok({\n ...game,\n result: result,\n });\n};\n","import { err, isErr, ok } from \"@utils/result.js\";\nimport {\n gameSteps,\n type GameState,\n type GameStateResult,\n type GameWithNextAction,\n type NextAction,\n type NextStep,\n} from \"@core/domain/types/game.js\";\nimport {\n allLordsHavePlayed,\n canPlaceAndDominoPickedIsDefined,\n nextLordWithAction,\n} from \"@core/domain/entities/lord.js\";\nimport { placeDomino } from \"@core/domain/entities/kingdom.js\";\nimport type {\n Position,\n Rotation,\n} from \"@core/domain/types/kingdom.js\";\n\nexport type PlaceDominoUseCase = (\n game: GameWithNextAction,\n lordId: string,\n position: Position,\n rotation: Rotation\n) => GameStateResult;\n\nexport const placeDominoUseCase: PlaceDominoUseCase = (\n game,\n lordId,\n position,\n rotation\n) => {\n const nextAction = game.nextAction;\n\n const currentLord = game.lords.find(\n (lord) => lord.id === nextAction.nextLord\n );\n\n if (!currentLord) {\n return err(\"Lord not found\");\n }\n\n if (currentLord.id !== lordId) {\n return err(\"Not your turn\");\n }\n\n if (!canPlaceAndDominoPickedIsDefined(currentLord)) {\n return err(\"Lord can't place\");\n }\n\n const domino = currentLord.dominoPicked;\n\n const currentPlayer = game.players.find(\n (player) => player.id === currentLord.playerId\n );\n\n if (!currentPlayer) {\n return err(\"Player not found\");\n }\n\n const updatedKingdom = placeDomino(\n currentPlayer.kingdom,\n position,\n rotation,\n domino\n );\n\n if (isErr(updatedKingdom)) {\n return updatedKingdom;\n }\n\n const updatedPlayers = game.players.map((player) => {\n if (player.id === currentPlayer.id) {\n player.kingdom = updatedKingdom.value;\n }\n return player;\n });\n\n const maxTurns = game.rules.basic.maxTurns;\n const currentTurn = game.turn;\n const isLastTurn = currentTurn === maxTurns;\n\n const updatedLords = game.lords.map((lord) => {\n if (lord.id === currentLord.id) {\n if (isLastTurn) {\n return {\n ...lord,\n turnEnded: true,\n hasPlace: true,\n };\n }\n return {\n ...lord,\n hasPlace: true,\n };\n }\n return lord;\n });\n\n let updatedGame: GameState;\n\n const resultStep: NextStep = {\n type: \"step\",\n step: gameSteps.result,\n };\n\n if (isLastTurn && allLordsHavePlayed(updatedLords)) {\n updatedGame = {\n ...game,\n lords: updatedLords,\n nextAction: resultStep,\n players: updatedPlayers,\n };\n } else {\n updatedGame = {\n ...game,\n lords: updatedLords,\n nextAction: <NextAction>nextLordWithAction(updatedLords),\n players: updatedPlayers,\n };\n }\n\n return ok(updatedGame);\n};\n","import { createLord } from \"@core/domain/entities/lord\";\nimport type {\n GameWithNextAction,\n GameWithNextStep,\n NextAction,\n} from \"@core/domain/types/game.js\";\nimport type { Lord } from \"@core/domain/types/lord.js\";\nimport { playerActions } from \"@core/domain/types/player.js\";\nimport type { ShuffleMethod } from \"@core/portServerside/shuffleMethod.js\";\nimport type { UuidMethod } from \"@core/portServerside/uuidMethod.js\";\nimport { ok, type Result } from \"@utils/result.js\";\n\nexport type StartGameUseCase = (\n game: GameWithNextStep\n) => Result<GameWithNextAction>;\n\nexport const startGameUseCase =\n (deps: {\n uuidMethod: UuidMethod;\n shuffleMethod: ShuffleMethod;\n }): StartGameUseCase =>\n (game) => {\n const { uuidMethod, shuffleMethod } = deps;\n const {\n rules: {\n basic: { lords: maxLords, dominoesPerTurn },\n },\n players,\n dominoes,\n } = game;\n\n const numberOfPlayers = players.length;\n\n const newLords: Lord[] = [];\n\n for (let i = 0; i < numberOfPlayers; i++) {\n for (let j = 0; j < maxLords; j++) {\n const lord = createLord(uuidMethod(), players[i]!.id);\n newLords.push(lord);\n }\n }\n\n const shuffledLords = shuffleMethod(newLords);\n const dominoesCopy = [...dominoes];\n const dominoesDrawn = dominoesCopy.splice(0, dominoesPerTurn);\n dominoesDrawn.sort((a, b) => a.number - b.number);\n const nextAction: NextAction = {\n type: \"action\",\n nextLord: shuffledLords[0]!.id,\n nextAction: playerActions.pickDomino,\n };\n\n const newState: GameWithNextAction = {\n ...game,\n lords: shuffledLords,\n nextAction,\n dominoes: dominoesCopy,\n currentDominoes: dominoesDrawn.map((domino, index) => {\n return {\n domino,\n picked: false,\n lordId: null,\n position: index + 1,\n };\n }),\n };\n\n return ok(newState);\n };\n","import type { Kingdom, Score } from \"@core/domain/types/index.js\";\nimport { ok, type Result } from \"@utils/result.js\";\n\nexport type CalculateScoreUseCase = (kingdom: Kingdom) => Result<Score>;\n\ntype Property = {\n type: string;\n crowns: number;\n size: number;\n tiles: number[][];\n};\n\nexport const calculateScoreUseCase: CalculateScoreUseCase = (kingdom) => {\n const visited: boolean[][] = kingdom.map((row) => row.map(() => false));\n const properties: Property[] = [];\n\n const directions = [\n [-1, 0],\n [1, 0],\n [0, -1],\n [0, 1],\n ]; // Up, Down, Left, Right\n\n const markZone = (\n x: number,\n y: number,\n type: string,\n crowns: number\n ): void => {\n if (\n x < 0 ||\n y < 0 ||\n x >= kingdom[0]!.length ||\n y >= kingdom.length ||\n visited[y]![x] ||\n kingdom[y]![x]!.type !== type ||\n kingdom[y]![x]!.type === \"empty\" ||\n kingdom[y]![x]!.type === \"castle\"\n ) {\n return;\n }\n\n visited[y]![x] = true;\n const currentZone = properties.find(\n (property) =>\n property.type === type &&\n property.tiles.some(([tx, ty]) => {\n for (let [dx, dy] of directions) {\n if (\n (tx as number) + (dx as number) === x &&\n (ty as number) + (dy as number) === y\n ) {\n return true;\n }\n }\n return false;\n })\n );\n\n if (currentZone) {\n currentZone.size += 1;\n currentZone.tiles.push([x, y]);\n currentZone.crowns += crowns;\n } else {\n properties.push({\n type,\n crowns,\n size: 1,\n tiles: [[x, y]],\n });\n }\n\n directions.forEach(([dx, dy]) => {\n const nx = x + (dx as number);\n const ny = y + (dy as number);\n if (\n nx >= 0 &&\n ny >= 0 &&\n nx < kingdom[0]!.length &&\n ny < kingdom.length &&\n kingdom[ny]![nx]!.type === type\n ) {\n markZone(nx, ny, kingdom[ny]![nx]!.type, kingdom[ny]![nx]!.crowns);\n }\n });\n };\n\n kingdom.forEach((row, y) => {\n row.forEach((tile, x) => {\n if (!visited[y]![x]) {\n markZone(x, y, tile.type, tile.crowns);\n }\n });\n });\n\n if (properties.length === 0) {\n return ok({\n points: 0,\n maxPropertiesSize: 0,\n totalCrowns: 0,\n });\n }\n\n let points = properties.reduce((acc, property) => {\n return acc + property.size * property.crowns;\n }, 0);\n\n const maxPropertiesSize = Math.max(\n ...properties.map((property) => property.size)\n );\n const totalCrowns = properties.reduce(\n (acc, property) => acc + property.crowns,\n 0\n );\n\n return ok({\n points,\n maxPropertiesSize,\n totalCrowns,\n });\n};\n","import jsonDominoes from \"@adapter/jsonDominoes.js\";\nimport jsonModes from \"@adapter/jsonModes.js\";\nimport jsonRules from \"@adapter/jsonRules.js\";\nimport { shuffleMethod } from \"@adapter/shuffle.js\";\nimport { uuidMethod } from \"@adapter/uuid.js\";\nimport { winstonLogger } from \"@adapter/winstonLogger.js\";\nimport { addExtraRulesHandler } from \"@application/handlers/addExtraRulesHandler.js\";\nimport { addPlayersHandler } from \"@application/handlers/addPlayersHandler.js\";\nimport { chooseDominoHandler } from \"@application/handlers/chooseDominoHandler.js\";\nimport { createGameHandler } from \"@application/handlers/createGameHandler.js\";\nimport { discardDominoHandler } from \"@application/handlers/discardDominoHandler.js\";\nimport { getExtraRulesHandler } from \"@application/handlers/getExtraRulesHandler.js\";\nimport { getModesHandler } from \"@application/handlers/getModesHandler.js\";\nimport { getResultHandler } from \"@application/handlers/getResultHandler.js\";\nimport { placeDominoHandler } from \"@application/handlers/placeDominoHandler.js\";\nimport { startGameHandler } from \"@application/handlers/startGameHandler.js\";\nimport { calculateScoreHandler } from \"@application/handlers/calculateScoreHandler.js\";\nimport type { ShuffleMethod } from \"@core/portServerside/shuffleMethod.js\";\nimport type { UuidMethod } from \"@core/portServerside/uuidMethod.js\";\nimport { addExtraRulesUseCase } from \"@core/useCases/addExtraRules.js\";\nimport { addPlayersUseCase } from \"@core/useCases/addPlayers.js\";\nimport { chooseDominoUseCase } from \"@core/useCases/chooseDomino.js\";\nimport { createGameUseCase } from \"@core/useCases/createGame.js\";\nimport { discardDominoUseCase } from \"@core/useCases/discardDomino.js\";\nimport { getExtraRulesUseCase } from \"@core/useCases/getExtraRules.js\";\nimport { getModesUseCase } from \"@core/useCases/getModes.js\";\nimport { getResultUseCase } from \"@core/useCases/getResult.js\";\nimport { placeDominoUseCase } from \"@core/useCases/placeDomino.js\";\nimport { startGameUseCase } from \"@core/useCases/startGame.js\";\nimport { calculateScoreUseCase } from \"@core/useCases/calculateScore.js\";\n\nexport type EngineConfig = {\n uuidMethod?: UuidMethod;\n shuffleMethod?: ShuffleMethod;\n logging?: boolean;\n};\n\nexport const configureEngine = (config: Partial<EngineConfig>) => {\n const modeRepository = jsonModes();\n const dominoesRepository = jsonDominoes();\n const ruleRepository = jsonRules();\n const uuid = config.uuidMethod || uuidMethod;\n const shuffle = config.shuffleMethod || shuffleMethod;\n const logger = config.logging ? winstonLogger(true) : winstonLogger(false);\n\n return {\n createGameHandler: createGameHandler(\n logger,\n createGameUseCase({\n modeRepository,\n dominoesRepository,\n uuidMethod: uuid,\n })\n ),\n getModesHandler: getModesHandler(\n logger,\n getModesUseCase({ modeRepository })\n ),\n getExtraRulesHandler: getExtraRulesHandler(\n logger,\n getExtraRulesUseCase({ ruleRepository })\n ),\n addPlayersHandler: addPlayersHandler(\n logger,\n addPlayersUseCase({\n uuidMethod: uuid,\n shuffleMethod: shuffle,\n ruleRepository,\n })\n ),\n addExtraRulesHandler: addExtraRulesHandler(\n logger,\n addExtraRulesUseCase({ ruleRepository })\n ),\n startGameHandler: startGameHandler(\n logger,\n startGameUseCase({ uuidMethod: uuid, shuffleMethod: shuffle })\n ),\n chooseDominoHandler: chooseDominoHandler(logger, chooseDominoUseCase),\n placeDominoHandler: placeDominoHandler(logger, placeDominoUseCase),\n discardDominoHandler: discardDominoHandler(logger, discardDominoUseCase),\n getResultHandler: getResultHandler(logger, {\n getResultUseCase,\n calculateScoreUseCase,\n }),\n calculateScoreHandler: calculateScoreHandler(logger, calculateScoreUseCase),\n };\n};\n","import type { GameEngine } from \"@core/portUserside/engine\";\nimport { configureEngine, type EngineConfig } from \"./config.js\";\n\nexport * from \"@application/commands/index.js\";\nexport * from \"@core/domain/types/index.js\";\nexport * from \"@core/portServerside/index.js\";\nexport * from \"@core/portUserside/engine.js\";\n\nexport const createGameEngine = (config: Partial<EngineConfig>): GameEngine => {\n const {\n createGameHandler,\n getModesHandler,\n getExtraRulesHandler,\n addPlayersHandler,\n addExtraRulesHandler,\n startGameHandler,\n chooseDominoHandler,\n placeDominoHandler,\n discardDominoHandler,\n getResultHandler,\n calculateScoreHandler,\n } = configureEngine(config);\n\n return {\n getModes: (command) => getModesHandler(command),\n getExtraRules: (command) => getExtraRulesHandler(command),\n createGame: (command) => createGameHandler(command),\n addPlayers: (command) => addPlayersHandler(command),\n addExtraRules: (command) => addExtraRulesHandler(command),\n startGame: (command) => startGameHandler(command),\n chooseDomino: (command) => chooseDominoHandler(command),\n placeDomino: (command) => placeDominoHandler(command),\n discardDomino: (command) => discardDominoHandler(command),\n getResults: (command) => getResultHandler(command),\n calculateScore: (command) => calculateScoreHandler(command),\n };\n};\n"],"mappings":"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","names":["getResultUseCase","calculateScoreUseCase","result","uuidMethod","shuffleMethod","lord","next","updatedCurrentDominoes","uuidMethod","uuidMethod","shuffleMethod","createGameHandler","getModesHandler","getExtraRulesHandler","addPlayersHandler","addExtraRulesHandler","startGameHandler","chooseDominoHandler","placeDominoHandler","discardDominoHandler","getResultHandler","calculateScoreHandler"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pompidup/kingdomino-engine",
3
- "version": "2.2.1",
3
+ "version": "3.0.0",
4
4
  "description": "A simple engine for the game Kingdomino",
5
5
  "main": "./dist/index.js",
6
6
  "type": "module",