@littlepartytime/dev-kit 1.0.0 → 1.2.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.
Files changed (58) hide show
  1. package/dist/cli.d.ts.map +1 -1
  2. package/dist/cli.js +4 -3
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/dev.d.ts +12 -0
  5. package/dist/commands/dev.d.ts.map +1 -0
  6. package/dist/commands/dev.js +76 -0
  7. package/dist/commands/dev.js.map +1 -0
  8. package/dist/index.d.ts +2 -0
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +3 -1
  11. package/dist/index.js.map +1 -1
  12. package/dist/server/engine-loader.d.ts +11 -0
  13. package/dist/server/engine-loader.d.ts.map +1 -0
  14. package/dist/server/engine-loader.js +45 -0
  15. package/dist/server/engine-loader.js.map +1 -0
  16. package/dist/server/game-room.d.ts +25 -0
  17. package/dist/server/game-room.d.ts.map +1 -0
  18. package/dist/server/game-room.js +78 -0
  19. package/dist/server/game-room.js.map +1 -0
  20. package/dist/server/socket-server.d.ts +16 -0
  21. package/dist/server/socket-server.d.ts.map +1 -0
  22. package/dist/server/socket-server.js +167 -0
  23. package/dist/server/socket-server.js.map +1 -0
  24. package/dist/testing/game-preview.d.ts +53 -0
  25. package/dist/testing/game-preview.d.ts.map +1 -0
  26. package/dist/testing/game-preview.js +158 -0
  27. package/dist/testing/game-preview.js.map +1 -0
  28. package/dist/testing/index.d.ts +3 -0
  29. package/dist/testing/index.d.ts.map +1 -0
  30. package/dist/testing/index.js +6 -0
  31. package/dist/testing/index.js.map +1 -0
  32. package/dist/webapp/App.d.ts +3 -0
  33. package/dist/webapp/App.d.ts.map +1 -0
  34. package/dist/webapp/App.js +70 -0
  35. package/dist/webapp/App.js.map +1 -0
  36. package/dist/webapp/App.tsx +40 -0
  37. package/dist/webapp/index.html +16 -0
  38. package/dist/webapp/main.d.ts +2 -0
  39. package/dist/webapp/main.d.ts.map +1 -0
  40. package/dist/webapp/main.js +12 -0
  41. package/dist/webapp/main.js.map +1 -0
  42. package/dist/webapp/main.tsx +9 -0
  43. package/dist/webapp/pages/Debug.d.ts +3 -0
  44. package/dist/webapp/pages/Debug.d.ts.map +1 -0
  45. package/dist/webapp/pages/Debug.js +69 -0
  46. package/dist/webapp/pages/Debug.js.map +1 -0
  47. package/dist/webapp/pages/Debug.tsx +40 -0
  48. package/dist/webapp/pages/Play.d.ts +3 -0
  49. package/dist/webapp/pages/Play.d.ts.map +1 -0
  50. package/dist/webapp/pages/Play.js +129 -0
  51. package/dist/webapp/pages/Play.js.map +1 -0
  52. package/dist/webapp/pages/Play.tsx +137 -0
  53. package/dist/webapp/pages/Preview.d.ts +3 -0
  54. package/dist/webapp/pages/Preview.d.ts.map +1 -0
  55. package/dist/webapp/pages/Preview.js +118 -0
  56. package/dist/webapp/pages/Preview.js.map +1 -0
  57. package/dist/webapp/pages/Preview.tsx +265 -0
  58. package/package.json +31 -3
@@ -0,0 +1,158 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.GamePreview = void 0;
37
+ const PLAYER_NAMES = ['Alice', 'Bob', 'Carol', 'Dave', 'Eve', 'Frank', 'Grace', 'Heidi'];
38
+ class GamePreview {
39
+ options;
40
+ serverHandle = null;
41
+ browser = null;
42
+ context = null;
43
+ playerPages = [];
44
+ constructor(options) {
45
+ this.options = {
46
+ port: 4100,
47
+ socketPort: 4101,
48
+ headless: true,
49
+ browserType: 'chromium',
50
+ ...options,
51
+ };
52
+ }
53
+ /**
54
+ * Start the dev server and launch browser pages for each player.
55
+ * Each player automatically joins the game lobby.
56
+ */
57
+ async start() {
58
+ // 1. Start dev server programmatically
59
+ const { devCommand } = await Promise.resolve().then(() => __importStar(require('../commands/dev')));
60
+ this.serverHandle = await devCommand(this.options.projectDir, {
61
+ port: this.options.port,
62
+ socketPort: this.options.socketPort,
63
+ silent: true,
64
+ });
65
+ // 2. Launch browser (dynamic import to handle optional dependency)
66
+ let playwright;
67
+ try {
68
+ // Use variable to prevent TypeScript from resolving the module at compile time
69
+ const moduleName = 'playwright';
70
+ playwright = await Promise.resolve(`${moduleName}`).then(s => __importStar(require(s)));
71
+ }
72
+ catch {
73
+ throw new Error('GamePreview requires playwright. Install it with: npm install -D playwright');
74
+ }
75
+ const browserType = playwright[this.options.browserType];
76
+ if (!browserType) {
77
+ throw new Error(`Unknown browser type: ${this.options.browserType}`);
78
+ }
79
+ this.browser = await browserType.launch({
80
+ headless: this.options.headless,
81
+ });
82
+ this.context = await this.browser.newContext();
83
+ // 3. Open pages and join lobby for each player
84
+ for (let i = 0; i < this.options.playerCount; i++) {
85
+ const nickname = PLAYER_NAMES[i] || `Player ${i + 1}`;
86
+ const page = await this.context.newPage();
87
+ await page.goto(`http://localhost:${this.options.port}/play`);
88
+ // Fill nickname and join
89
+ await page.fill('input[placeholder="Your nickname"]', nickname);
90
+ await page.click('button:has-text("Join")');
91
+ // Wait for lobby to appear
92
+ await page.waitForSelector('text=Lobby', { timeout: 10000 });
93
+ this.playerPages.push({ page, nickname });
94
+ }
95
+ }
96
+ /**
97
+ * Get the Playwright Page object for a specific player by index.
98
+ * Player 0 is the host.
99
+ */
100
+ getPlayerPage(playerIndex) {
101
+ if (playerIndex < 0 || playerIndex >= this.playerPages.length) {
102
+ throw new Error(`Invalid playerIndex: ${playerIndex}. Valid range: 0-${this.playerPages.length - 1}`);
103
+ }
104
+ return this.playerPages[playerIndex].page;
105
+ }
106
+ /**
107
+ * Get all Playwright Page objects.
108
+ */
109
+ getPlayerPages() {
110
+ return this.playerPages.map(pp => pp.page);
111
+ }
112
+ /**
113
+ * Get the number of players.
114
+ */
115
+ get playerCount() {
116
+ return this.playerPages.length;
117
+ }
118
+ /**
119
+ * Click "Ready" for all players.
120
+ */
121
+ async readyAll() {
122
+ for (const pp of this.playerPages) {
123
+ const readyButton = pp.page.locator('button:has-text("Ready")');
124
+ await readyButton.click();
125
+ // Small delay to let Socket.IO propagate
126
+ await pp.page.waitForTimeout(100);
127
+ }
128
+ }
129
+ /**
130
+ * Have the host start the game. Requires all players to be ready.
131
+ */
132
+ async startGame() {
133
+ const hostPage = this.playerPages[0].page;
134
+ await hostPage.click('button:has-text("Start Game")');
135
+ // Wait for game state to load on all pages
136
+ await Promise.all(this.playerPages.map(pp => pp.page.waitForTimeout(500)));
137
+ }
138
+ /**
139
+ * Stop the browser and dev server, cleaning up all resources.
140
+ */
141
+ async stop() {
142
+ if (this.context) {
143
+ await this.context.close().catch(() => { });
144
+ this.context = null;
145
+ }
146
+ if (this.browser) {
147
+ await this.browser.close().catch(() => { });
148
+ this.browser = null;
149
+ }
150
+ if (this.serverHandle) {
151
+ await this.serverHandle.stop();
152
+ this.serverHandle = null;
153
+ }
154
+ this.playerPages = [];
155
+ }
156
+ }
157
+ exports.GamePreview = GamePreview;
158
+ //# sourceMappingURL=game-preview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"game-preview.js","sourceRoot":"","sources":["../../src/testing/game-preview.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { GamePreview } from './game-preview';
2
+ export type { GamePreviewOptions } from './game-preview';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,YAAY,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GamePreview = void 0;
4
+ var game_preview_1 = require("./game-preview");
5
+ Object.defineProperty(exports, "GamePreview", { enumerable: true, get: function () { return game_preview_1.GamePreview; } });
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":";;;AAAA,+CAA6C;AAApC,2GAAA,WAAW,OAAA"}
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ export default function App(): React.JSX.Element;
3
+ //# sourceMappingURL=App.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../src/webapp/App.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAOxC,MAAM,CAAC,OAAO,UAAU,GAAG,sBAgC1B"}
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.default = App;
40
+ const react_1 = __importStar(require("react"));
41
+ const Preview_1 = __importDefault(require("./pages/Preview"));
42
+ const Play_1 = __importDefault(require("./pages/Play"));
43
+ const Debug_1 = __importDefault(require("./pages/Debug"));
44
+ function App() {
45
+ const [page, setPage] = (0, react_1.useState)(() => {
46
+ const path = window.location.pathname;
47
+ if (path.includes('play'))
48
+ return 'play';
49
+ if (path.includes('debug'))
50
+ return 'debug';
51
+ return 'preview';
52
+ });
53
+ return (<div className="min-h-screen flex flex-col">
54
+ {/* Nav */}
55
+ <nav className="bg-zinc-900 border-b border-zinc-800 px-4 py-2 flex gap-4">
56
+ <span className="text-amber-500 font-bold mr-4">LPT Dev Kit</span>
57
+ {['preview', 'play', 'debug'].map((p) => (<button key={p} onClick={() => { setPage(p); history.pushState(null, '', `/${p}`); }} className={`px-3 py-1 rounded ${page === p ? 'bg-amber-600 text-white' : 'text-zinc-400 hover:text-white'}`}>
58
+ {p.charAt(0).toUpperCase() + p.slice(1)}
59
+ </button>))}
60
+ </nav>
61
+
62
+ {/* Content */}
63
+ <main className="flex-1 p-4">
64
+ {page === 'preview' && <Preview_1.default />}
65
+ {page === 'play' && <Play_1.default />}
66
+ {page === 'debug' && <Debug_1.default />}
67
+ </main>
68
+ </div>);
69
+ }
70
+ //# sourceMappingURL=App.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"App.js","sourceRoot":"","sources":["../../src/webapp/App.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA,sBAgCC;AAvCD,+CAAwC;AACxC,8DAAsC;AACtC,wDAAgC;AAChC,0DAAkC;AAIlC,SAAwB,GAAG;IACzB,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,IAAA,gBAAQ,EAAO,GAAG,EAAE;QAC1C,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACtC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,OAAO,MAAM,CAAC;QACzC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,OAAO,OAAO,CAAC;QAC3C,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC,CAAC;IAEH,OAAO,CACL,CAAC,GAAG,CAAC,SAAS,CAAC,4BAA4B,CACzC;MAAA,CAAC,SAAS,CACV;MAAA,CAAC,GAAG,CAAC,SAAS,CAAC,2DAA2D,CACxE;QAAA,CAAC,IAAI,CAAC,SAAS,CAAC,+BAA+B,CAAC,WAAW,EAAE,IAAI,CACjE;QAAA,CAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CACnD,CAAC,MAAM,CACL,GAAG,CAAC,CAAC,CAAC,CAAC,CACP,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CACrE,SAAS,CAAC,CAAC,qBAAqB,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,gCAAgC,EAAE,CAAC,CAE5G;YAAA,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CACzC;UAAA,EAAE,MAAM,CAAC,CACV,CAAC,CACJ;MAAA,EAAE,GAAG,CAEL;;MAAA,CAAC,aAAa,CACd;MAAA,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAC1B;QAAA,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,iBAAO,CAAC,AAAD,EAAG,CAClC;QAAA,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,cAAI,CAAC,AAAD,EAAG,CAC5B;QAAA,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,eAAK,CAAC,AAAD,EAAG,CAChC;MAAA,EAAE,IAAI,CACR;IAAA,EAAE,GAAG,CAAC,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,40 @@
1
+ import React, { useState } from 'react';
2
+ import Preview from './pages/Preview';
3
+ import Play from './pages/Play';
4
+ import Debug from './pages/Debug';
5
+
6
+ type Page = 'preview' | 'play' | 'debug';
7
+
8
+ export default function App() {
9
+ const [page, setPage] = useState<Page>(() => {
10
+ const path = window.location.pathname;
11
+ if (path.includes('play')) return 'play';
12
+ if (path.includes('debug')) return 'debug';
13
+ return 'preview';
14
+ });
15
+
16
+ return (
17
+ <div className="min-h-screen flex flex-col">
18
+ {/* Nav */}
19
+ <nav className="bg-zinc-900 border-b border-zinc-800 px-4 py-2 flex gap-4">
20
+ <span className="text-amber-500 font-bold mr-4">LPT Dev Kit</span>
21
+ {(['preview', 'play', 'debug'] as Page[]).map((p) => (
22
+ <button
23
+ key={p}
24
+ onClick={() => { setPage(p); history.pushState(null, '', `/${p}`); }}
25
+ className={`px-3 py-1 rounded ${page === p ? 'bg-amber-600 text-white' : 'text-zinc-400 hover:text-white'}`}
26
+ >
27
+ {p.charAt(0).toUpperCase() + p.slice(1)}
28
+ </button>
29
+ ))}
30
+ </nav>
31
+
32
+ {/* Content */}
33
+ <main className="flex-1 p-4">
34
+ {page === 'preview' && <Preview />}
35
+ {page === 'play' && <Play />}
36
+ {page === 'debug' && <Debug />}
37
+ </main>
38
+ </div>
39
+ );
40
+ }
@@ -0,0 +1,16 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>LPT Dev Kit</title>
7
+ <script src="https://cdn.tailwindcss.com"></script>
8
+ <style>
9
+ body { background: #0a0a0a; color: #e5e5e5; }
10
+ </style>
11
+ </head>
12
+ <body>
13
+ <div id="root"></div>
14
+ <script type="module" src="/main.tsx"></script>
15
+ </body>
16
+ </html>
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=main.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/webapp/main.tsx"],"names":[],"mappings":""}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const react_1 = __importDefault(require("react"));
7
+ const client_1 = __importDefault(require("react-dom/client"));
8
+ const App_1 = __importDefault(require("./App"));
9
+ client_1.default.createRoot(document.getElementById('root')).render(<react_1.default.StrictMode>
10
+ <App_1.default />
11
+ </react_1.default.StrictMode>);
12
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/webapp/main.tsx"],"names":[],"mappings":";;;;;AAAA,kDAA0B;AAC1B,8DAAwC;AACxC,gDAAwB;AAExB,gBAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAE,CAAC,CAAC,MAAM,CAC1D,CAAC,eAAK,CAAC,UAAU,CACf;IAAA,CAAC,aAAG,CAAC,AAAD,EACN;EAAA,EAAE,eAAK,CAAC,UAAU,CAAC,CACpB,CAAC"}
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ import ReactDOM from 'react-dom/client';
3
+ import App from './App';
4
+
5
+ ReactDOM.createRoot(document.getElementById('root')!).render(
6
+ <React.StrictMode>
7
+ <App />
8
+ </React.StrictMode>
9
+ );
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ export default function Debug(): React.JSX.Element;
3
+ //# sourceMappingURL=Debug.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Debug.d.ts","sourceRoot":"","sources":["../../../src/webapp/pages/Debug.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAGnD,MAAM,CAAC,OAAO,UAAU,KAAK,sBAoC5B"}
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.default = Debug;
37
+ const react_1 = __importStar(require("react"));
38
+ const socket_io_client_1 = require("socket.io-client");
39
+ function Debug() {
40
+ const [socket, setSocket] = (0, react_1.useState)(null);
41
+ const [room, setRoom] = (0, react_1.useState)({ players: [], phase: 'lobby' });
42
+ const [fullState, setFullState] = (0, react_1.useState)(null);
43
+ (0, react_1.useEffect)(() => {
44
+ const sock = (0, socket_io_client_1.io)('http://localhost:4001', { query: { nickname: '__debug__' } });
45
+ sock.on('room:update', setRoom);
46
+ sock.on('game:state', setFullState);
47
+ sock.on('debug:state', setFullState);
48
+ setSocket(sock);
49
+ return () => { sock.disconnect(); };
50
+ }, []);
51
+ return (<div className="grid grid-cols-2 gap-4 h-[calc(100vh-80px)]">
52
+ {/* Room State */}
53
+ <div className="bg-zinc-900 rounded-lg p-4 overflow-auto">
54
+ <h2 className="text-lg font-bold mb-4 text-amber-400">Room State</h2>
55
+ <pre className="text-xs font-mono whitespace-pre-wrap">
56
+ {JSON.stringify(room, null, 2)}
57
+ </pre>
58
+ </div>
59
+
60
+ {/* Game State */}
61
+ <div className="bg-zinc-900 rounded-lg p-4 overflow-auto">
62
+ <h2 className="text-lg font-bold mb-4 text-amber-400">Full Game State</h2>
63
+ <pre className="text-xs font-mono whitespace-pre-wrap">
64
+ {fullState ? JSON.stringify(fullState, null, 2) : 'No game in progress'}
65
+ </pre>
66
+ </div>
67
+ </div>);
68
+ }
69
+ //# sourceMappingURL=Debug.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Debug.js","sourceRoot":"","sources":["../../../src/webapp/pages/Debug.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGA,wBAoCC;AAvCD,+CAAmD;AACnD,uDAA8C;AAE9C,SAAwB,KAAK;IAC3B,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,IAAA,gBAAQ,EAAgB,IAAI,CAAC,CAAC;IAC1D,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,IAAA,gBAAQ,EAAM,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;IACvE,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,IAAA,gBAAQ,EAAM,IAAI,CAAC,CAAC;IAEtD,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,MAAM,IAAI,GAAG,IAAA,qBAAE,EAAC,uBAAuB,EAAE,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;QAE/E,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QAChC,IAAI,CAAC,EAAE,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;QACpC,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;QAErC,SAAS,CAAC,IAAI,CAAC,CAAC;QAEhB,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC;IACtC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,CACL,CAAC,GAAG,CAAC,SAAS,CAAC,6CAA6C,CAC1D;MAAA,CAAC,gBAAgB,CACjB;MAAA,CAAC,GAAG,CAAC,SAAS,CAAC,0CAA0C,CACvD;QAAA,CAAC,EAAE,CAAC,SAAS,CAAC,uCAAuC,CAAC,UAAU,EAAE,EAAE,CACpE;QAAA,CAAC,GAAG,CAAC,SAAS,CAAC,uCAAuC,CACpD;UAAA,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAChC;QAAA,EAAE,GAAG,CACP;MAAA,EAAE,GAAG,CAEL;;MAAA,CAAC,gBAAgB,CACjB;MAAA,CAAC,GAAG,CAAC,SAAS,CAAC,0CAA0C,CACvD;QAAA,CAAC,EAAE,CAAC,SAAS,CAAC,uCAAuC,CAAC,eAAe,EAAE,EAAE,CACzE;QAAA,CAAC,GAAG,CAAC,SAAS,CAAC,uCAAuC,CACpD;UAAA,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,qBAAqB,CACzE;QAAA,EAAE,GAAG,CACP;MAAA,EAAE,GAAG,CACP;IAAA,EAAE,GAAG,CAAC,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,40 @@
1
+ import React, { useState, useEffect } from 'react';
2
+ import { io, Socket } from 'socket.io-client';
3
+
4
+ export default function Debug() {
5
+ const [socket, setSocket] = useState<Socket | null>(null);
6
+ const [room, setRoom] = useState<any>({ players: [], phase: 'lobby' });
7
+ const [fullState, setFullState] = useState<any>(null);
8
+
9
+ useEffect(() => {
10
+ const sock = io('http://localhost:4001', { query: { nickname: '__debug__' } });
11
+
12
+ sock.on('room:update', setRoom);
13
+ sock.on('game:state', setFullState);
14
+ sock.on('debug:state', setFullState);
15
+
16
+ setSocket(sock);
17
+
18
+ return () => { sock.disconnect(); };
19
+ }, []);
20
+
21
+ return (
22
+ <div className="grid grid-cols-2 gap-4 h-[calc(100vh-80px)]">
23
+ {/* Room State */}
24
+ <div className="bg-zinc-900 rounded-lg p-4 overflow-auto">
25
+ <h2 className="text-lg font-bold mb-4 text-amber-400">Room State</h2>
26
+ <pre className="text-xs font-mono whitespace-pre-wrap">
27
+ {JSON.stringify(room, null, 2)}
28
+ </pre>
29
+ </div>
30
+
31
+ {/* Game State */}
32
+ <div className="bg-zinc-900 rounded-lg p-4 overflow-auto">
33
+ <h2 className="text-lg font-bold mb-4 text-amber-400">Full Game State</h2>
34
+ <pre className="text-xs font-mono whitespace-pre-wrap">
35
+ {fullState ? JSON.stringify(fullState, null, 2) : 'No game in progress'}
36
+ </pre>
37
+ </div>
38
+ </div>
39
+ );
40
+ }
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ export default function Play(): React.JSX.Element;
3
+ //# sourceMappingURL=Play.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Play.d.ts","sourceRoot":"","sources":["../../../src/webapp/pages/Play.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA2C,MAAM,OAAO,CAAC;AAGhE,MAAM,CAAC,OAAO,UAAU,IAAI,sBAqI3B"}
@@ -0,0 +1,129 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.default = Play;
37
+ const react_1 = __importStar(require("react"));
38
+ const socket_io_client_1 = require("socket.io-client");
39
+ function Play() {
40
+ const [socket, setSocket] = (0, react_1.useState)(null);
41
+ const [nickname, setNickname] = (0, react_1.useState)('');
42
+ const [joined, setJoined] = (0, react_1.useState)(false);
43
+ const [room, setRoom] = (0, react_1.useState)({ players: [], phase: 'lobby' });
44
+ const [gameState, setGameState] = (0, react_1.useState)(null);
45
+ const [myId, setMyId] = (0, react_1.useState)(null);
46
+ const [GameRenderer, setGameRenderer] = (0, react_1.useState)(null);
47
+ // Load renderer
48
+ (0, react_1.useEffect)(() => {
49
+ Promise.resolve().then(() => __importStar(require('/src/renderer.tsx'))).then((mod) => {
50
+ setGameRenderer(() => mod.default || mod.Renderer);
51
+ }).catch(console.error);
52
+ }, []);
53
+ const join = (0, react_1.useCallback)(() => {
54
+ if (!nickname.trim())
55
+ return;
56
+ const sock = (0, socket_io_client_1.io)('http://localhost:4001', { query: { nickname } });
57
+ sock.on('connect', () => {
58
+ setMyId(sock.id);
59
+ setJoined(true);
60
+ });
61
+ sock.on('room:update', setRoom);
62
+ sock.on('game:state', setGameState);
63
+ sock.on('game:result', (result) => {
64
+ console.log('Game result:', result);
65
+ });
66
+ setSocket(sock);
67
+ }, [nickname]);
68
+ const me = room.players.find((p) => socket && p.socketId === socket.id) || room.players.find((p) => p.nickname === nickname);
69
+ const isHost = me?.isHost;
70
+ const isReady = me?.ready;
71
+ const platform = socket ? {
72
+ getPlayers: () => room.players.map((p) => ({ id: p.id, nickname: p.nickname, avatarUrl: null, isHost: p.isHost })),
73
+ getLocalPlayer: () => me ? { id: me.id, nickname: me.nickname, avatarUrl: null, isHost: me.isHost } : { id: '', nickname: '', avatarUrl: null, isHost: false },
74
+ send: (action) => socket.emit('game:action', action),
75
+ on: (event, handler) => {
76
+ if (event === 'stateUpdate')
77
+ socket.on('game:state', handler);
78
+ },
79
+ off: (event, handler) => {
80
+ if (event === 'stateUpdate')
81
+ socket.off('game:state', handler);
82
+ },
83
+ reportResult: () => { },
84
+ } : null;
85
+ if (!joined) {
86
+ return (<div className="flex items-center justify-center h-[60vh]">
87
+ <div className="bg-zinc-900 rounded-lg p-6 w-80">
88
+ <h2 className="text-xl font-bold mb-4">Join Game</h2>
89
+ <input type="text" placeholder="Your nickname" value={nickname} onChange={(e) => setNickname(e.target.value)} onKeyDown={(e) => e.key === 'Enter' && join()} className="w-full bg-zinc-800 border border-zinc-700 rounded px-3 py-2 mb-4"/>
90
+ <button onClick={join} className="w-full bg-amber-600 hover:bg-amber-500 text-white py-2 rounded font-semibold">
91
+ Join
92
+ </button>
93
+ </div>
94
+ </div>);
95
+ }
96
+ if (room.phase === 'lobby' || room.phase === 'ready') {
97
+ return (<div className="max-w-md mx-auto mt-8">
98
+ <div className="bg-zinc-900 rounded-lg p-6">
99
+ <h2 className="text-xl font-bold mb-4">Lobby</h2>
100
+ <div className="space-y-2 mb-6">
101
+ {room.players.map((p) => (<div key={p.id} className="flex items-center justify-between bg-zinc-800 rounded px-3 py-2">
102
+ <span>{p.nickname} {p.isHost && '(Host)'}</span>
103
+ <span className={p.ready ? 'text-green-400' : 'text-zinc-500'}>
104
+ {p.ready ? 'Ready' : 'Not Ready'}
105
+ </span>
106
+ </div>))}
107
+ </div>
108
+ <div className="flex gap-2">
109
+ <button onClick={() => socket?.emit('player:ready', !isReady)} className={`flex-1 py-2 rounded font-semibold ${isReady ? 'bg-zinc-700 text-zinc-300' : 'bg-green-600 text-white'}`}>
110
+ {isReady ? 'Cancel Ready' : 'Ready'}
111
+ </button>
112
+ {isHost && (<button onClick={() => socket?.emit('game:start')} disabled={!room.players.every((p) => p.ready) || room.players.length < 2} className="flex-1 bg-amber-600 hover:bg-amber-500 disabled:opacity-50 text-white py-2 rounded font-semibold">
113
+ Start Game
114
+ </button>)}
115
+ </div>
116
+ </div>
117
+ </div>);
118
+ }
119
+ // Playing or ended
120
+ return (<div className="h-[calc(100vh-80px)]">
121
+ {GameRenderer && platform && gameState ? (<GameRenderer platform={platform} state={gameState}/>) : (<div className="p-4 text-zinc-500">Loading game...</div>)}
122
+ {room.phase === 'ended' && isHost && (<div className="fixed bottom-4 left-1/2 -translate-x-1/2">
123
+ <button onClick={() => socket?.emit('game:playAgain')} className="bg-amber-600 hover:bg-amber-500 text-white px-6 py-2 rounded-full font-semibold">
124
+ Play Again
125
+ </button>
126
+ </div>)}
127
+ </div>);
128
+ }
129
+ //# sourceMappingURL=Play.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Play.js","sourceRoot":"","sources":["../../../src/webapp/pages/Play.tsx"],"names":[],"mappings":"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"}