Skip to content

Commit faeeb93

Browse files
committed
Add support for gameData in dev-server
1 parent 0af00ef commit faeeb93

File tree

5 files changed

+3077
-6051
lines changed

5 files changed

+3077
-6051
lines changed

packages/dev-server/package.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@
2828
"compile": "rollup --config",
2929
"watch": "rollup --config --watch",
3030
"format": "pnpm exec eslint . --fix",
31-
"check-format": "pnpm exec eslint . --quiet"
31+
"check-format": "pnpm exec eslint . --quiet",
32+
"test": "pnpm vitest run src"
3233
},
3334
"devDependencies": {
3435
"@lefun/core": "workspace:*",
@@ -53,7 +54,8 @@
5354
"rollup": "^4.15.0",
5455
"rollup-plugin-postcss": "^4.0.0",
5556
"tailwindcss": "^3.4.3",
56-
"typescript": "^5.5.2"
57+
"typescript": "^5.5.2",
58+
"vitest": "^1.2.1"
5759
},
5860
"peerDependencies": {
5961
"@lefun/core": "workspace:*",

packages/dev-server/src/App.tsx

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,8 @@ const BoardForPlayer = <B, PB>({
120120
playerboard: playerboard as PB,
121121
payload,
122122
delayMove: () => {
123-
throw new Error("delayMove not implemented yet");
123+
console.warn("delayMove not implemented yet");
124+
return { ts: 0 };
124125
},
125126
});
126127
});
@@ -378,10 +379,12 @@ function Main<B, PB = EmptyObject, SB = EmptyObject>({
378379
gameDef,
379380
matchSettings,
380381
matchData,
382+
gameData,
381383
}: {
382384
gameDef: GameDef<B, PB, SB>;
383385
matchSettings: MatchSettings;
384386
matchData?: any;
387+
gameData?: any;
385388
}) {
386389
const locale = useStore((state) => state.locale);
387390
const layout = useStore((state) => state.layout);
@@ -436,6 +439,7 @@ function Main<B, PB = EmptyObject, SB = EmptyObject>({
436439
matchSettings,
437440
matchPlayersSettings,
438441
matchData,
442+
gameData,
439443
players,
440444
locale,
441445
});
@@ -445,7 +449,7 @@ function Main<B, PB = EmptyObject, SB = EmptyObject>({
445449
(window as any).lefun.match = matchRef.current;
446450
saveMatch(match);
447451
},
448-
[gameDef, matchData, matchSettings],
452+
[gameDef, matchData, gameData, matchSettings],
449453
);
450454

451455
const firstRender = useRef(true);
@@ -524,13 +528,15 @@ async function render<B, PB = EmptyObject, SB = EmptyObject>({
524528
board,
525529
matchSettings = {},
526530
matchData,
531+
gameData,
527532
idName = "home",
528533
messages = { en: {} },
529534
}: {
530535
gameDef: GameDef<B, PB, SB>;
531536
board: () => Promise<ReactNode>;
532537
matchSettings?: MatchSettings;
533538
matchData?: any;
539+
gameData?: any;
534540
idName?: string;
535541
messages?: AllMessages;
536542
}) {
@@ -573,6 +579,7 @@ async function render<B, PB = EmptyObject, SB = EmptyObject>({
573579
gameDef={gameDef}
574580
matchSettings={matchSettings}
575581
matchData={matchData}
582+
gameData={gameData}
576583
/>
577584
);
578585

packages/dev-server/src/match.test.ts

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
import { enablePatches, produceWithPatches } from "immer";
2+
import { expect, test } from "vitest";
3+
4+
import { separatePatchesByUser } from "./match";
5+
6+
enablePatches();
7+
8+
/* Compare two arrays, ignoring order. */
9+
function expectArraysEqual<T>(a: T[], b: T[]) {
10+
expect(a.length).toBe(b.length);
11+
for (const aa of a) {
12+
expect(b).toContainEqual(aa);
13+
}
14+
}
15+
16+
test("separatePatchesByUser", () => {
17+
const matchState = {
18+
board: { x: 123 },
19+
playerboards: {
20+
user1: { x: 123 },
21+
user2: { x: 123 },
22+
},
23+
};
24+
25+
const [, patches] = produceWithPatches(matchState, (draft) => {
26+
draft.board = { x: 456 };
27+
draft.playerboards.user1 = { x: 456 };
28+
draft.playerboards.user2 = { x: 456 };
29+
});
30+
31+
expectArraysEqual(patches, [
32+
{
33+
op: "replace",
34+
path: ["playerboards", "user1"],
35+
value: { x: 456 },
36+
},
37+
{
38+
op: "replace",
39+
path: ["playerboards", "user2"],
40+
value: { x: 456 },
41+
},
42+
{
43+
op: "replace",
44+
path: ["board"],
45+
value: { x: 456 },
46+
},
47+
]);
48+
49+
// Without ignoreUserId
50+
{
51+
const patchesByUser = {
52+
user1: [],
53+
user2: [],
54+
};
55+
56+
separatePatchesByUser({
57+
patches,
58+
userIds: ["user1", "user2"],
59+
ignoreUserId: null,
60+
patchesOut: patchesByUser,
61+
});
62+
63+
expectArraysEqual(patchesByUser["user1"], [
64+
{
65+
op: "replace",
66+
path: ["board"],
67+
value: { x: 456 },
68+
},
69+
{
70+
op: "replace",
71+
path: ["playerboard"],
72+
value: { x: 456 },
73+
},
74+
]);
75+
76+
expectArraysEqual(patchesByUser["user2"], [
77+
{
78+
op: "replace",
79+
path: ["board"],
80+
value: { x: 456 },
81+
},
82+
{
83+
op: "replace",
84+
path: ["playerboard"],
85+
value: { x: 456 },
86+
},
87+
]);
88+
}
89+
90+
// With ignoreUserId
91+
{
92+
const patchesByUser = {
93+
user1: [],
94+
user2: [],
95+
};
96+
97+
separatePatchesByUser({
98+
patches,
99+
userIds: ["user1", "user2"],
100+
ignoreUserId: "user1",
101+
patchesOut: patchesByUser,
102+
});
103+
104+
expectArraysEqual(patchesByUser["user1"], []);
105+
106+
expectArraysEqual(patchesByUser["user2"], [
107+
{
108+
op: "replace",
109+
path: ["board"],
110+
value: { x: 456 },
111+
},
112+
{
113+
op: "replace",
114+
path: ["playerboard"],
115+
value: { x: 456 },
116+
},
117+
]);
118+
}
119+
});

0 commit comments

Comments
 (0)