diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 895a028..96c2a65 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -21,5 +21,5 @@ jobs: cache: 'pnpm' - run: make install - run: make build - - run: make check-format + - run: make check - run: make test diff --git a/Makefile b/Makefile index 6a79749..d3787f5 100644 --- a/Makefile +++ b/Makefile @@ -10,17 +10,17 @@ build: test: pnpm run -r test -.PHONY: format -format: +.PHONY: fix +fix: pnpm prettier ui game --write cd game && pnpm eslint . --fix cd ui && pnpm eslint . --fix -.PHONY: check-format -check-format: +.PHONY: check +check: pnpm prettier ui game --check - cd game && pnpm eslint . --quiet - cd ui && pnpm eslint . --quiet + cd game && pnpm eslint . --quiet && pnpm tsc --noEmit --skipLibCheck + cd ui && pnpm eslint . --quiet && pnpm tsc --noEmit --skipLibCheck .PHONY: watch watch: @@ -29,3 +29,6 @@ watch: .PHONY: dev dev: cd ui && pnpm run dev + +.PHONY: all +all: fix check test diff --git a/game/package.json b/game/package.json index 288ef58..b20e360 100644 --- a/game/package.json +++ b/game/package.json @@ -21,8 +21,8 @@ "lodash-es": "^4.17.21" }, "devDependencies": { - "@lefun/core": "2.5.1", - "@lefun/game": "2.5.1", + "@lefun/core": "3.0.0-alpha.3", + "@lefun/game": "3.0.0-alpha.3", "@rollup/plugin-commonjs": "^21.0.1", "@rollup/plugin-node-resolve": "^13.0.6", "@typescript-eslint/eslint-plugin": "^7.11.0", @@ -37,7 +37,7 @@ "vitest": "^2.0.5" }, "peerDependencies": { - "@lefun/core": ">=2.5.0", - "@lefun/game": ">=2.5.0" + "@lefun/core": ">=3.0.0", + "@lefun/game": ">=3.0.0" } } diff --git a/game/src/index.test.ts b/game/src/index.test.ts index 37bab12..e82e164 100644 --- a/game/src/index.test.ts +++ b/game/src/index.test.ts @@ -399,9 +399,8 @@ test("its your turn", () => { } match.meta.players.allIds.forEach((userId) => { - expect(match.meta.players.byId[userId].itsYourTurn).toBe( - (userIds as UserId[]).includes(userId), - ); + const shouldHaveTurn = userIds.includes(userId); + expect(match.hasTurn(userId)).toBe(shouldHaveTurn); }); }; diff --git a/game/src/index.ts b/game/src/index.ts index e9bda27..67c6aed 100644 --- a/game/src/index.ts +++ b/game/src/index.ts @@ -193,7 +193,7 @@ const bet: PlayerMove = { incrementCurrentPlayer(board); }, execute({ turns, board }) { - turns.end("all"); + turns.endAll(); turns.begin(board.playerOrder[board.currentPlayerIndex]); }, }; @@ -281,7 +281,7 @@ const call: PlayerMove = { }); // The turn is over, all the people alive must roll. - turns.end("all"); + turns.endAll(); turns.begin(alivePlayers.map((p) => p.userId)); if (winner != null) { @@ -312,7 +312,7 @@ const roll: PlayerMove = { const { numDice } = playerboards[userId]; // Roll the dice for the player that is ready. - const diceValues = random.d6(numDice); + const diceValues = random.d6({ size: numDice }); playerboards[userId].diceValues = diceValues; playerboards[userId].isRolling = false; @@ -359,7 +359,7 @@ const roll: PlayerMove = { board.bet = undefined; // `everyoneHasRolled` has changed the current player - turns.end("all"); + turns.endAll(); turns.begin(board.playerOrder[board.currentPlayerIndex]); } else { turns.end(userId); @@ -413,7 +413,7 @@ export const game = { playerboards[userId] = { numDice: startNumDice, - diceValues: random.d6(startNumDice), + diceValues: random.d6({ size: startNumDice }), isRolling: false, }; }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7f31f97..4b94568 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -19,11 +19,11 @@ importers: version: 4.17.21 devDependencies: '@lefun/core': - specifier: 2.5.1 - version: 2.5.1 + specifier: 3.0.0-alpha.3 + version: 3.0.0-alpha.3 '@lefun/game': - specifier: 2.5.1 - version: 2.5.1(@lefun/core@2.5.1) + specifier: 3.0.0-alpha.3 + version: 3.0.0-alpha.3(@lefun/core@3.0.0-alpha.3) '@rollup/plugin-commonjs': specifier: ^21.0.1 version: 21.1.0(rollup@2.79.1) @@ -83,20 +83,20 @@ importers: specifier: ^7.24.7 version: 7.24.7(@babel/core@7.24.7) '@lefun/core': - specifier: 2.5.1 - version: 2.5.1 + specifier: 3.0.0-alpha.3 + version: 3.0.0-alpha.3 '@lefun/dev-server': - specifier: 2.5.1 - version: 2.5.1(@lefun/core@2.5.1)(@lefun/game@2.5.1(@lefun/core@2.5.1))(@lefun/ui@2.5.1(@lefun/core@2.5.1)(@lefun/game@2.5.1(@lefun/core@2.5.1))(@types/react@18.3.3)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@lingui/core@4.11.2)(@lingui/react@4.11.2(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 3.0.0-alpha.3 + version: 3.0.0-alpha.3(@lefun/core@3.0.0-alpha.3)(@lefun/game@3.0.0-alpha.3(@lefun/core@3.0.0-alpha.3))(@lefun/ui@3.0.0-alpha.3(@lefun/core@3.0.0-alpha.3)(@lefun/game@3.0.0-alpha.3(@lefun/core@3.0.0-alpha.3))(@types/react@18.3.3)(immer@10.2.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@lingui/core@4.11.2)(@lingui/react@4.11.2(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@lefun/game': - specifier: 2.5.1 - version: 2.5.1(@lefun/core@2.5.1) + specifier: 3.0.0-alpha.3 + version: 3.0.0-alpha.3(@lefun/core@3.0.0-alpha.3) '@lefun/ui': - specifier: 2.5.1 - version: 2.5.1(@lefun/core@2.5.1)(@lefun/game@2.5.1(@lefun/core@2.5.1))(@types/react@18.3.3)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 3.0.0-alpha.3 + version: 3.0.0-alpha.3(@lefun/core@3.0.0-alpha.3)(@lefun/game@3.0.0-alpha.3(@lefun/core@3.0.0-alpha.3))(@types/react@18.3.3)(immer@10.2.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@lefun/ui-testing': - specifier: 2.5.1 - version: 2.5.1(@lefun/ui@2.5.1(@lefun/core@2.5.1)(@lefun/game@2.5.1(@lefun/core@2.5.1))(@types/react@18.3.3)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@lingui/core@4.11.2)(@lingui/react@4.11.2(react@18.3.1))(@testing-library/dom@10.1.0)(@types/react-dom@18.3.0)(@types/react@18.3.3)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 3.0.0-alpha.3 + version: 3.0.0-alpha.3(@lefun/core@3.0.0-alpha.3)(@lefun/game@3.0.0-alpha.3(@lefun/core@3.0.0-alpha.3))(@lefun/ui@3.0.0-alpha.3(@lefun/core@3.0.0-alpha.3)(@lefun/game@3.0.0-alpha.3(@lefun/core@3.0.0-alpha.3))(@types/react@18.3.3)(immer@10.2.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@lingui/core@4.11.2)(@lingui/react@4.11.2(react@18.3.1))(@testing-library/dom@10.1.0)(@types/react-dom@18.3.0)(@types/react@18.3.3)(immer@10.2.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@lingui/cli': specifier: ^4.11.1 version: 4.11.1(typescript@5.4.5) @@ -210,6 +210,10 @@ packages: resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} engines: {node: '>=6.9.0'} + '@babel/code-frame@7.29.0': + resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} + engines: {node: '>=6.9.0'} + '@babel/compat-data@7.24.7': resolution: {integrity: sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==} engines: {node: '>=6.9.0'} @@ -272,6 +276,10 @@ packages: resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-option@7.24.7': resolution: {integrity: sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==} engines: {node: '>=6.9.0'} @@ -341,8 +349,8 @@ packages: resolution: {integrity: sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==} engines: {node: '>=6.9.0'} - '@babel/runtime@7.25.6': - resolution: {integrity: sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==} + '@babel/runtime@7.28.6': + resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==} engines: {node: '>=6.9.0'} '@babel/template@7.24.7': @@ -687,39 +695,41 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - '@lefun/core@2.5.1': - resolution: {integrity: sha512-6A3+j0oXyrp7lydjJ9Un+k7wUKNsgy5BvrhGTkD+r7GcdexYnTV4ugHNqgfL2Bes+ykO4MYR4N2qCryrxleEyQ==} + '@lefun/core@3.0.0-alpha.3': + resolution: {integrity: sha512-I5lv2kIOePEwNXxfZUR/jN11STGIG1xiU4LeFfFAF0zo6tsvXc6r7GEdjZvkQaUMU+iQn51lCBlh20NSr78UAg==} - '@lefun/dev-server@2.5.1': - resolution: {integrity: sha512-U/c8kJlv5m3gEDl22as9a41yHad4JJgLIl79Z9nHP52dkFY07K+e1sXttkwI5GeIpgasqrvd+RpRh0iGv+3inA==} + '@lefun/dev-server@3.0.0-alpha.3': + resolution: {integrity: sha512-nBSCbBxTzXQwvdSxzcoRppA7X4i8FF420h6lYkQkolI3ZXmOiaZJ6S7kcaSyKcrOctSyFwn0QuTPJIdh99UPQg==} peerDependencies: - '@lefun/core': 2.5.1 - '@lefun/game': 2.5.1 - '@lefun/ui': 2.5.1 + '@lefun/core': 3.0.0-alpha.3 + '@lefun/game': 3.0.0-alpha.3 + '@lefun/ui': 3.0.0-alpha.3 '@lingui/core': ^4.11.2 '@lingui/react': ^4.11.2 react: '>=17.0.2' react-dom: '>=17.0.2' - '@lefun/game@2.5.1': - resolution: {integrity: sha512-tczKnmeT/9Z8Mz65RQpdXpVj7Hma0r+i+1PvhB+7d+VMl2OCZBCZdUzbUKS7Du5BjShBkjGZGOf2/XsrX/GR3Q==} + '@lefun/game@3.0.0-alpha.3': + resolution: {integrity: sha512-oeFnp49xU0hEAcPF7vBXV+Ng5D1I2YWVNeSWGz8OFsSFdGVEMwzWch3r5G4wfRKwEmRv3lEqLr/qBTH4eGJOfw==} peerDependencies: - '@lefun/core': 2.5.1 + '@lefun/core': 3.0.0-alpha.3 - '@lefun/ui-testing@2.5.1': - resolution: {integrity: sha512-PkUpvKoy86zfuQxwRAFBkZ0auPFS5ZGdRjLSgVINKUb6UEsSBdIwc8k3QHzbBMkymJXd7Hu1iNQC06hwx9A7Bw==} + '@lefun/ui-testing@3.0.0-alpha.3': + resolution: {integrity: sha512-CKD5+TjdttEnoZktVmeROqptSGFufI7Q+jn+4Qof+bAP7NcWkPGrYrHnEEpr78leEro02sOWlYjSAckri8IJdQ==} peerDependencies: - '@lefun/ui': 2.5.1 + '@lefun/core': 3.0.0-alpha.3 + '@lefun/game': 3.0.0-alpha.3 + '@lefun/ui': 3.0.0-alpha.3 '@lingui/core': ^4.7.1 '@lingui/react': ^4.7.1 react: '>=17.0.2' react-dom: '>=17.0.2' - '@lefun/ui@2.5.1': - resolution: {integrity: sha512-Z7N1VTFi5OCXZ5q1dRWb3iuMlPHKTebIOwotSREFMV506VuUkM+qhUswu3lCJSG6CPVHLpgdQfyrADwG9eKAvQ==} + '@lefun/ui@3.0.0-alpha.3': + resolution: {integrity: sha512-1Mb2tT4/a8mDHRjo/svN5Pyc36YheUQ+zrXCz5qloD+bkYhbOMbbnPdsEVgZLwnK+xdGFXRToJDCVnJR7J5rGQ==} peerDependencies: - '@lefun/core': 2.5.1 - '@lefun/game': 2.5.1 + '@lefun/core': 3.0.0-alpha.3 + '@lefun/game': 3.0.0-alpha.3 react: '>=17.0.2' react-dom: '>=17.0.2' @@ -1863,8 +1873,8 @@ packages: resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} engines: {node: '>= 4'} - immer@10.1.1: - resolution: {integrity: sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==} + immer@10.2.0: + resolution: {integrity: sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw==} import-cwd@3.0.0: resolution: {integrity: sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==} @@ -2000,8 +2010,8 @@ packages: json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - json-edit-react@1.15.9: - resolution: {integrity: sha512-0ujasLgq/sfPnHeE3Qm/4RNjI/NR0HvxhipO+zmemhjgs1CvGYKB5isqxy2nnsMTH6xRaqfrDbM8KbGI8LF3Kg==} + json-edit-react@1.29.0: + resolution: {integrity: sha512-qxho/m0w6GCaKLic6XsZgmCrKKwluMvoy92teRBRus1PRHJQiP4pkFQJ90lmrno1KNgSePYIG0mcscS0GjdH3A==} peerDependencies: react: '>=16.0.0' @@ -2062,6 +2072,9 @@ packages: lodash-es@4.17.21: resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + lodash-es@4.17.23: + resolution: {integrity: sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==} + lodash.camelcase@4.3.0: resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} @@ -2211,11 +2224,11 @@ packages: resolution: {integrity: sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==} engines: {node: '>= 6'} - object-property-assigner@1.3.1: - resolution: {integrity: sha512-3R6x1l1sQA4jQBOqxkxH3DHw0PMh7K5UY4x1Yc5QYbbkzZpAJ8l9w+Trq/64ZRe2thiOsa8JpB4M7D61hnkjRA==} + object-property-assigner@1.3.5: + resolution: {integrity: sha512-DIzHzNSTnpoG8QPQCDNrHa6O3vLMhktK3Igirqpk523UYIVe8JNCKcn5C9WyLQxJc58EGsAIiiEu10gqPrud8w==} - object-property-extractor@1.0.12: - resolution: {integrity: sha512-X6rMK1O6O3EU4O06BtATezWKr+5idX6Yo0PndVqr8NlED3Eoa2YE+VKQgQL4EK0+vh+YA83Sjj9Nsi/PuXXeDQ==} + object-property-extractor@1.0.14: + resolution: {integrity: sha512-euG3MQwj41DMbfk1keguY+jKQvaf9r26NeECtb28G8jABnhZVqxVEvIFywWC2107cSgx8dimA+JXuCAZFfbsSg==} once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} @@ -2330,6 +2343,9 @@ packages: picocolors@1.0.1: resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} @@ -3002,10 +3018,10 @@ packages: url-parse@1.5.10: resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} - use-sync-external-store@1.2.2: - resolution: {integrity: sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==} + use-sync-external-store@1.6.0: + resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -3151,8 +3167,8 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - zustand@4.5.5: - resolution: {integrity: sha512-+0PALYNJNgK6hldkgDq2vLrw5f6g/jCInz52n9RTpropGgeAf/ioFUCdtsjCqu4gNhW9D01rUQBROoRjdzyn2Q==} + zustand@4.5.7: + resolution: {integrity: sha512-CHOUy7mu3lbD6o6LJLfllpjkzhHXSBlX8B9+qPddUsIfeF5S/UZ5q0kmCsnRqT1UHFQZchNFDDzMbQsuesHWlw==} engines: {node: '>=12.7.0'} peerDependencies: '@types/react': '>=16.8' @@ -3178,6 +3194,12 @@ snapshots: '@babel/highlight': 7.24.7 picocolors: 1.0.1 + '@babel/code-frame@7.29.0': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 + '@babel/compat-data@7.24.7': {} '@babel/core@7.24.7': @@ -3267,6 +3289,8 @@ snapshots: '@babel/helper-validator-identifier@7.24.7': {} + '@babel/helper-validator-identifier@7.28.5': {} + '@babel/helper-validator-option@7.24.7': {} '@babel/helpers@7.24.7': @@ -3345,9 +3369,7 @@ snapshots: dependencies: regenerator-runtime: 0.14.1 - '@babel/runtime@7.25.6': - dependencies: - regenerator-runtime: 0.14.1 + '@babel/runtime@7.28.6': {} '@babel/template@7.24.7': dependencies: @@ -3578,52 +3600,54 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.4.15 - '@lefun/core@2.5.1': {} + '@lefun/core@3.0.0-alpha.3': {} - '@lefun/dev-server@2.5.1(@lefun/core@2.5.1)(@lefun/game@2.5.1(@lefun/core@2.5.1))(@lefun/ui@2.5.1(@lefun/core@2.5.1)(@lefun/game@2.5.1(@lefun/core@2.5.1))(@types/react@18.3.3)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@lingui/core@4.11.2)(@lingui/react@4.11.2(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@lefun/dev-server@3.0.0-alpha.3(@lefun/core@3.0.0-alpha.3)(@lefun/game@3.0.0-alpha.3(@lefun/core@3.0.0-alpha.3))(@lefun/ui@3.0.0-alpha.3(@lefun/core@3.0.0-alpha.3)(@lefun/game@3.0.0-alpha.3(@lefun/core@3.0.0-alpha.3))(@types/react@18.3.3)(immer@10.2.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@lingui/core@4.11.2)(@lingui/react@4.11.2(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@lefun/core': 2.5.1 - '@lefun/game': 2.5.1(@lefun/core@2.5.1) - '@lefun/ui': 2.5.1(@lefun/core@2.5.1)(@lefun/game@2.5.1(@lefun/core@2.5.1))(@types/react@18.3.3)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@lefun/core': 3.0.0-alpha.3 + '@lefun/game': 3.0.0-alpha.3(@lefun/core@3.0.0-alpha.3) + '@lefun/ui': 3.0.0-alpha.3(@lefun/core@3.0.0-alpha.3)(@lefun/game@3.0.0-alpha.3(@lefun/core@3.0.0-alpha.3))(@types/react@18.3.3)(immer@10.2.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@lingui/core': 4.11.2 '@lingui/react': 4.11.2(react@18.3.1) classnames: 2.5.1 - immer: 10.1.1 - json-edit-react: 1.15.9(react@18.3.1) + immer: 10.2.0 + json-edit-react: 1.29.0(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - zustand: 4.5.5(@types/react@18.3.3)(immer@10.1.1)(react@18.3.1) + zustand: 4.5.7(@types/react@18.3.3)(immer@10.2.0)(react@18.3.1) transitivePeerDependencies: - '@types/react' - '@lefun/game@2.5.1(@lefun/core@2.5.1)': + '@lefun/game@3.0.0-alpha.3(@lefun/core@3.0.0-alpha.3)': dependencies: - '@lefun/core': 2.5.1 - immer: 10.1.1 - lodash-es: 4.17.21 + '@lefun/core': 3.0.0-alpha.3 + immer: 10.2.0 + lodash-es: 4.17.23 - '@lefun/ui-testing@2.5.1(@lefun/ui@2.5.1(@lefun/core@2.5.1)(@lefun/game@2.5.1(@lefun/core@2.5.1))(@types/react@18.3.3)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@lingui/core@4.11.2)(@lingui/react@4.11.2(react@18.3.1))(@testing-library/dom@10.1.0)(@types/react-dom@18.3.0)(@types/react@18.3.3)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@lefun/ui-testing@3.0.0-alpha.3(@lefun/core@3.0.0-alpha.3)(@lefun/game@3.0.0-alpha.3(@lefun/core@3.0.0-alpha.3))(@lefun/ui@3.0.0-alpha.3(@lefun/core@3.0.0-alpha.3)(@lefun/game@3.0.0-alpha.3(@lefun/core@3.0.0-alpha.3))(@types/react@18.3.3)(immer@10.2.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@lingui/core@4.11.2)(@lingui/react@4.11.2(react@18.3.1))(@testing-library/dom@10.1.0)(@types/react-dom@18.3.0)(@types/react@18.3.3)(immer@10.2.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@lefun/ui': 2.5.1(@lefun/core@2.5.1)(@lefun/game@2.5.1(@lefun/core@2.5.1))(@types/react@18.3.3)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@lefun/core': 3.0.0-alpha.3 + '@lefun/game': 3.0.0-alpha.3(@lefun/core@3.0.0-alpha.3) + '@lefun/ui': 3.0.0-alpha.3(@lefun/core@3.0.0-alpha.3)(@lefun/game@3.0.0-alpha.3(@lefun/core@3.0.0-alpha.3))(@types/react@18.3.3)(immer@10.2.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@lingui/core': 4.11.2 '@lingui/react': 4.11.2(react@18.3.1) '@testing-library/react': 16.0.0(@testing-library/dom@10.1.0)(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - zustand: 4.5.5(@types/react@18.3.3)(immer@10.1.1)(react@18.3.1) + zustand: 4.5.7(@types/react@18.3.3)(immer@10.2.0)(react@18.3.1) transitivePeerDependencies: - '@testing-library/dom' - '@types/react' - '@types/react-dom' - immer - '@lefun/ui@2.5.1(@lefun/core@2.5.1)(@lefun/game@2.5.1(@lefun/core@2.5.1))(@types/react@18.3.3)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@lefun/ui@3.0.0-alpha.3(@lefun/core@3.0.0-alpha.3)(@lefun/game@3.0.0-alpha.3(@lefun/core@3.0.0-alpha.3))(@types/react@18.3.3)(immer@10.2.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@lefun/core': 2.5.1 - '@lefun/game': 2.5.1(@lefun/core@2.5.1) + '@lefun/core': 3.0.0-alpha.3 + '@lefun/game': 3.0.0-alpha.3(@lefun/core@3.0.0-alpha.3) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - zustand: 4.5.5(@types/react@18.3.3)(immer@10.1.1)(react@18.3.1) + zustand: 4.5.7(@types/react@18.3.3)(immer@10.2.0)(react@18.3.1) transitivePeerDependencies: - '@types/react' - immer @@ -3894,8 +3918,8 @@ snapshots: '@testing-library/dom@10.1.0': dependencies: - '@babel/code-frame': 7.24.7 - '@babel/runtime': 7.25.6 + '@babel/code-frame': 7.29.0 + '@babel/runtime': 7.28.6 '@types/aria-query': 5.0.4 aria-query: 5.3.0 chalk: 4.1.2 @@ -4934,7 +4958,7 @@ snapshots: ignore@5.3.1: {} - immer@10.1.1: {} + immer@10.2.0: {} import-cwd@3.0.0: dependencies: @@ -5082,10 +5106,10 @@ snapshots: json-buffer@3.0.1: {} - json-edit-react@1.15.9(react@18.3.1): + json-edit-react@1.29.0(react@18.3.1): dependencies: - object-property-assigner: 1.3.1 - object-property-extractor: 1.0.12 + object-property-assigner: 1.3.5 + object-property-extractor: 1.0.14 react: 18.3.1 json-parse-even-better-errors@2.3.1: {} @@ -5138,6 +5162,8 @@ snapshots: lodash-es@4.17.21: {} + lodash-es@4.17.23: {} + lodash.camelcase@4.3.0: {} lodash.get@4.4.2: {} @@ -5257,9 +5283,9 @@ snapshots: object-hash@2.2.0: {} - object-property-assigner@1.3.1: {} + object-property-assigner@1.3.5: {} - object-property-extractor@1.0.12: {} + object-property-extractor@1.0.14: {} once@1.4.0: dependencies: @@ -5372,6 +5398,8 @@ snapshots: picocolors@1.0.1: {} + picocolors@1.1.1: {} + picomatch@2.3.1: {} pify@5.0.0: {} @@ -6032,7 +6060,7 @@ snapshots: querystringify: 2.2.0 requires-port: 1.0.0 - use-sync-external-store@1.2.2(react@18.3.1): + use-sync-external-store@1.6.0(react@18.3.1): dependencies: react: 18.3.1 @@ -6155,10 +6183,10 @@ snapshots: yocto-queue@0.1.0: {} - zustand@4.5.5(@types/react@18.3.3)(immer@10.1.1)(react@18.3.1): + zustand@4.5.7(@types/react@18.3.3)(immer@10.2.0)(react@18.3.1): dependencies: - use-sync-external-store: 1.2.2(react@18.3.1) + use-sync-external-store: 1.6.0(react@18.3.1) optionalDependencies: '@types/react': 18.3.3 - immer: 10.1.1 + immer: 10.2.0 react: 18.3.1 diff --git a/tsconfig.base.json b/tsconfig.base.json index cc6ea7b..547bffe 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -1,6 +1,7 @@ { "compilerOptions": { "strict": true, + "noEmitOnError": true, "target": "esnext", "module": "esnext", "lib": ["dom", "esnext"], diff --git a/ui/package.json b/ui/package.json index 973430b..9e7e2a8 100644 --- a/ui/package.json +++ b/ui/package.json @@ -26,11 +26,11 @@ }, "devDependencies": { "@babel/preset-react": "^7.24.7", - "@lefun/core": "2.5.1", - "@lefun/dev-server": "2.5.1", - "@lefun/game": "2.5.1", - "@lefun/ui": "2.5.1", - "@lefun/ui-testing": "2.5.1", + "@lefun/core": "3.0.0-alpha.3", + "@lefun/dev-server": "3.0.0-alpha.3", + "@lefun/game": "3.0.0-alpha.3", + "@lefun/ui": "3.0.0-alpha.3", + "@lefun/ui-testing": "3.0.0-alpha.3", "@lingui/cli": "^4.11.1", "@lingui/conf": "^4.11.1", "@lingui/macro": "^4.11.1", @@ -74,9 +74,9 @@ "tippy.js": "^6.3.1" }, "peerDependencies": { - "@lefun/core": ">=2.5.0", - "@lefun/game": ">=2.5.0", - "@lefun/ui": ">=2.5.0", + "@lefun/core": ">=3.0.0", + "@lefun/game": ">=3.0.0", + "@lefun/ui": ">=3.0.0", "react": ">=17.0.2", "react-dom": ">=17.0.2" } diff --git a/ui/src/Board.test.tsx b/ui/src/Board.test.tsx index 6bd4bdd..6f6d5c5 100644 --- a/ui/src/Board.test.tsx +++ b/ui/src/Board.test.tsx @@ -1,23 +1,24 @@ import { expect, test } from "vitest"; import type { UserId } from "@lefun/core"; -import { MatchTester as MatchTesterOrig } from "@lefun/game"; -import { render } from "@lefun/ui-testing"; -import { DudoGame, DudoGameState, game } from "dudo-game"; +import { MatchTester as _MatchTester } from "@lefun/game"; +import { getUIStateFromMatchTester, render } from "@lefun/ui-testing"; +import { DudoGame as G, DudoGameState as GS, game } from "dudo-game"; import Board, { getDefaultBet, getLowestQty, getLowestValue } from "./Board"; -class MatchTester extends MatchTesterOrig {} +class MatchTester extends _MatchTester {} // eslint-disable-next-line @typescript-eslint/no-explicit-any let utils: any; -const renderForPlayer = (match: MatchTester, userId: UserId) => { +const renderForPlayer = (matchTester: MatchTester, userId: UserId) => { // For some reason it's a pain to do multiple renders in the same test. This makes it // possible. if (utils) { utils.unmount(); } - utils = render(Board, match.getState(userId)); + const state = getUIStateFromMatchTester({ matchTester, userId }); + utils = render(Board, state); }; test("the info in the header", () => { diff --git a/ui/src/main.tsx b/ui/src/main.tsx index 9fb4230..da97bfd 100644 --- a/ui/src/main.tsx +++ b/ui/src/main.tsx @@ -7,6 +7,7 @@ import { messages as en } from "./locales/en/messages"; import { messages as fr } from "./locales/fr/messages"; render({ + gameId: "dudo", board: async () => { // @ts-expect-error the import is there even if TS does not see it! await import("./index.css"); @@ -20,6 +21,5 @@ render({ return ; }, game, - matchSettings: { startNumDice: "3" }, messages: { en, fr }, }); diff --git a/ui/src/selectors.ts b/ui/src/selectors.ts index 2b288d8..cbcd4f1 100644 --- a/ui/src/selectors.ts +++ b/ui/src/selectors.ts @@ -1,7 +1,7 @@ -import { MatchState } from "@lefun/ui"; +import { UIState } from "@lefun/ui"; import { DudoGameState } from "dudo-game"; -type State = MatchState; +type State = UIState; export const iHaveRolledSelector = (state: State) => { const player = state.board.players[state.userId]; diff --git a/ui/vite.config.ts b/ui/vite.config.ts index b1a46fe..0cd8889 100644 --- a/ui/vite.config.ts +++ b/ui/vite.config.ts @@ -15,7 +15,7 @@ export default defineConfig({ environment: "jsdom", }, resolve: { - dedupe: ["react", "react-dom"], + dedupe: ["react", "react-dom", "@lingui/react"], mainFields: ["module", "main"], }, });