@littlepartytime/dev-kit 1.19.0 → 1.20.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 (63) hide show
  1. package/dist/__tests__/engine-loader.test.d.ts +2 -0
  2. package/dist/__tests__/engine-loader.test.d.ts.map +1 -0
  3. package/dist/__tests__/engine-loader.test.js +48 -0
  4. package/dist/__tests__/engine-loader.test.js.map +1 -0
  5. package/dist/__tests__/games-api.test.d.ts +2 -0
  6. package/dist/__tests__/games-api.test.d.ts.map +1 -0
  7. package/dist/__tests__/games-api.test.js +109 -0
  8. package/dist/__tests__/games-api.test.js.map +1 -0
  9. package/dist/__tests__/lan-address.test.d.ts +2 -0
  10. package/dist/__tests__/lan-address.test.d.ts.map +1 -0
  11. package/dist/__tests__/lan-address.test.js +14 -0
  12. package/dist/__tests__/lan-address.test.js.map +1 -0
  13. package/dist/__tests__/validate-demo.test.d.ts +2 -0
  14. package/dist/__tests__/validate-demo.test.d.ts.map +1 -0
  15. package/dist/__tests__/validate-demo.test.js +73 -0
  16. package/dist/__tests__/validate-demo.test.js.map +1 -0
  17. package/dist/__tests__/zip-manager.test.d.ts +2 -0
  18. package/dist/__tests__/zip-manager.test.d.ts.map +1 -0
  19. package/dist/__tests__/zip-manager.test.js +111 -0
  20. package/dist/__tests__/zip-manager.test.js.map +1 -0
  21. package/dist/cli.d.ts.map +1 -1
  22. package/dist/cli.js +19 -0
  23. package/dist/cli.js.map +1 -1
  24. package/dist/commands/dev.d.ts.map +1 -1
  25. package/dist/commands/dev.js +11 -0
  26. package/dist/commands/dev.js.map +1 -1
  27. package/dist/commands/pack.d.ts.map +1 -1
  28. package/dist/commands/pack.js +6 -3
  29. package/dist/commands/pack.js.map +1 -1
  30. package/dist/commands/play.d.ts +7 -0
  31. package/dist/commands/play.d.ts.map +1 -0
  32. package/dist/commands/play.js +154 -0
  33. package/dist/commands/play.js.map +1 -0
  34. package/dist/server/engine-loader.d.ts +5 -0
  35. package/dist/server/engine-loader.d.ts.map +1 -1
  36. package/dist/server/engine-loader.js +23 -0
  37. package/dist/server/engine-loader.js.map +1 -1
  38. package/dist/server/games-api.d.ts +7 -0
  39. package/dist/server/games-api.d.ts.map +1 -0
  40. package/dist/server/games-api.js +189 -0
  41. package/dist/server/games-api.js.map +1 -0
  42. package/dist/server/lan-address.d.ts +2 -0
  43. package/dist/server/lan-address.d.ts.map +1 -0
  44. package/dist/server/lan-address.js +19 -0
  45. package/dist/server/lan-address.js.map +1 -0
  46. package/dist/server/socket-server.d.ts +3 -1
  47. package/dist/server/socket-server.d.ts.map +1 -1
  48. package/dist/server/socket-server.js +32 -5
  49. package/dist/server/socket-server.js.map +1 -1
  50. package/dist/server/zip-manager.d.ts +24 -0
  51. package/dist/server/zip-manager.d.ts.map +1 -0
  52. package/dist/server/zip-manager.js +99 -0
  53. package/dist/server/zip-manager.js.map +1 -0
  54. package/dist/utils/validate-demo.d.ts +10 -0
  55. package/dist/utils/validate-demo.d.ts.map +1 -0
  56. package/dist/utils/validate-demo.js +36 -0
  57. package/dist/utils/validate-demo.js.map +1 -0
  58. package/dist/webapp/App.tsx +3 -1
  59. package/dist/webapp/components/GameSelector.tsx +163 -0
  60. package/dist/webapp/pages/Debug.tsx +3 -1
  61. package/dist/webapp/pages/Play.tsx +143 -94
  62. package/dist/webapp/pages/Preview.tsx +273 -219
  63. package/package.json +1 -1
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=engine-loader.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine-loader.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/engine-loader.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,48 @@
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 vitest_1 = require("vitest");
7
+ const engine_loader_1 = require("../server/engine-loader");
8
+ const path_1 = __importDefault(require("path"));
9
+ const fs_1 = __importDefault(require("fs"));
10
+ const os_1 = __importDefault(require("os"));
11
+ (0, vitest_1.describe)('loadEngineFromPath', () => {
12
+ (0, vitest_1.it)('should load engine from an arbitrary absolute path', () => {
13
+ const tmpDir = fs_1.default.mkdtempSync(path_1.default.join(os_1.default.tmpdir(), 'lpt-test-'));
14
+ const enginePath = path_1.default.join(tmpDir, 'engine.cjs');
15
+ fs_1.default.writeFileSync(enginePath, `
16
+ module.exports = {
17
+ engine: {
18
+ init(players) { return { players: players.map(p => p.id), turn: 0 }; },
19
+ handleAction(state, playerId, action) { return { ...state, turn: state.turn + 1 }; },
20
+ isGameOver(state) { return state.turn >= 3; },
21
+ getResult(state) { return { winner: state.players[0] }; },
22
+ getPlayerView(state, playerId) { return state; },
23
+ }
24
+ };
25
+ `);
26
+ const engine = (0, engine_loader_1.loadEngineFromPath)(enginePath);
27
+ (0, vitest_1.expect)(engine).toBeDefined();
28
+ (0, vitest_1.expect)(typeof engine.init).toBe('function');
29
+ (0, vitest_1.expect)(typeof engine.handleAction).toBe('function');
30
+ (0, vitest_1.expect)(typeof engine.isGameOver).toBe('function');
31
+ (0, vitest_1.expect)(typeof engine.getResult).toBe('function');
32
+ (0, vitest_1.expect)(typeof engine.getPlayerView).toBe('function');
33
+ const state = engine.init([{ id: 'p1' }, { id: 'p2' }]);
34
+ (0, vitest_1.expect)(state.players).toEqual(['p1', 'p2']);
35
+ fs_1.default.rmSync(tmpDir, { recursive: true });
36
+ });
37
+ (0, vitest_1.it)('should throw if engine file does not exist', () => {
38
+ (0, vitest_1.expect)(() => (0, engine_loader_1.loadEngineFromPath)('/nonexistent/engine.cjs')).toThrow();
39
+ });
40
+ (0, vitest_1.it)('should throw if engine is missing required methods', () => {
41
+ const tmpDir = fs_1.default.mkdtempSync(path_1.default.join(os_1.default.tmpdir(), 'lpt-test-'));
42
+ const enginePath = path_1.default.join(tmpDir, 'engine.cjs');
43
+ fs_1.default.writeFileSync(enginePath, `module.exports = { engine: { init() {} } };`);
44
+ (0, vitest_1.expect)(() => (0, engine_loader_1.loadEngineFromPath)(enginePath)).toThrow('missing required method');
45
+ fs_1.default.rmSync(tmpDir, { recursive: true });
46
+ });
47
+ });
48
+ //# sourceMappingURL=engine-loader.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine-loader.test.js","sourceRoot":"","sources":["../../src/__tests__/engine-loader.test.ts"],"names":[],"mappings":";;;;;AAAA,mCAA8C;AAC9C,2DAA6D;AAC7D,gDAAwB;AACxB,4CAAoB;AACpB,4CAAoB;AAEpB,IAAA,iBAAQ,EAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,IAAA,WAAE,EAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,MAAM,GAAG,YAAE,CAAC,WAAW,CAAC,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,MAAM,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC;QACnE,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;QACnD,YAAE,CAAC,aAAa,CAAC,UAAU,EAAE;;;;;;;;;;KAU5B,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,IAAA,kCAAkB,EAAC,UAAU,CAAC,CAAC;QAC9C,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;QAC7B,IAAA,eAAM,EAAC,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC5C,IAAA,eAAM,EAAC,OAAO,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACpD,IAAA,eAAM,EAAC,OAAO,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAClD,IAAA,eAAM,EAAC,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACjD,IAAA,eAAM,EAAC,OAAO,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAErD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACxD,IAAA,eAAM,EAAC,KAAK,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QAE5C,YAAE,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,IAAA,eAAM,EAAC,GAAG,EAAE,CAAC,IAAA,kCAAkB,EAAC,yBAAyB,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,MAAM,GAAG,YAAE,CAAC,WAAW,CAAC,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,MAAM,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC;QACnE,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;QACnD,YAAE,CAAC,aAAa,CAAC,UAAU,EAAE,6CAA6C,CAAC,CAAC;QAE5E,IAAA,eAAM,EAAC,GAAG,EAAE,CAAC,IAAA,kCAAkB,EAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;QAEhF,YAAE,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=games-api.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"games-api.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/games-api.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,109 @@
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
+ // packages/dev-kit/src/__tests__/games-api.test.ts
7
+ const vitest_1 = require("vitest");
8
+ const http_1 = __importDefault(require("http"));
9
+ const fs_1 = __importDefault(require("fs"));
10
+ const path_1 = __importDefault(require("path"));
11
+ const os_1 = __importDefault(require("os"));
12
+ const archiver_1 = __importDefault(require("archiver"));
13
+ const zip_manager_1 = require("../server/zip-manager");
14
+ const games_api_1 = require("../server/games-api");
15
+ // Helper: create a valid game ZIP
16
+ async function createTestZip(dir, filename) {
17
+ const zipPath = path_1.default.join(dir, filename);
18
+ const output = fs_1.default.createWriteStream(zipPath);
19
+ const archive = (0, archiver_1.default)('zip');
20
+ archive.pipe(output);
21
+ archive.append(JSON.stringify({
22
+ name: 'Test Game',
23
+ description: 'A test',
24
+ version: '1.0.0',
25
+ sdkVersion: '2.0.0',
26
+ minPlayers: 2,
27
+ maxPlayers: 6,
28
+ tags: [],
29
+ assets: { icon: 'icon.png', banner: 'banner.png', cover: 'cover.png', splash: 'splash.png' },
30
+ rules: 'rules.md',
31
+ }), { name: 'manifest.json' });
32
+ archive.append(`
33
+ module.exports = {
34
+ engine: {
35
+ init(players) { return { players: players.map(p => p.id) }; },
36
+ handleAction(state) { return state; },
37
+ isGameOver() { return false; },
38
+ getResult(state) { return {}; },
39
+ getPlayerView(state) { return state; },
40
+ }
41
+ };
42
+ `, { name: 'engine.cjs' });
43
+ archive.append('// bundle', { name: 'bundle.js' });
44
+ archive.append(Buffer.from('PNG'), { name: 'icon.png' });
45
+ await archive.finalize();
46
+ await new Promise((resolve) => output.on('close', resolve));
47
+ return zipPath;
48
+ }
49
+ function makeRequest(server, method, path, body, contentType) {
50
+ return new Promise((resolve, reject) => {
51
+ const addr = server.address();
52
+ const req = http_1.default.request({ hostname: '127.0.0.1', port: addr.port, path, method, headers: contentType ? { 'Content-Type': contentType } : {} }, (res) => {
53
+ let data = '';
54
+ res.on('data', (chunk) => data += chunk);
55
+ res.on('end', () => resolve({ statusCode: res.statusCode, body: data }));
56
+ });
57
+ req.on('error', reject);
58
+ if (body)
59
+ req.write(body);
60
+ req.end();
61
+ });
62
+ }
63
+ (0, vitest_1.describe)('Games API', () => {
64
+ let tmpDir;
65
+ let manager;
66
+ let server;
67
+ (0, vitest_1.beforeEach)(async () => {
68
+ tmpDir = fs_1.default.mkdtempSync(path_1.default.join(os_1.default.tmpdir(), 'lpt-api-test-'));
69
+ manager = new zip_manager_1.ZipManager();
70
+ const middleware = (0, games_api_1.createGamesApi)(manager);
71
+ server = http_1.default.createServer(middleware);
72
+ await new Promise((resolve) => server.listen(0, '127.0.0.1', resolve));
73
+ });
74
+ (0, vitest_1.afterEach)(async () => {
75
+ manager.cleanup();
76
+ fs_1.default.rmSync(tmpDir, { recursive: true, force: true });
77
+ await new Promise((resolve) => server.close(() => resolve()));
78
+ });
79
+ (0, vitest_1.it)('GET /api/games should return empty list initially', async () => {
80
+ const res = await makeRequest(server, 'GET', '/api/games');
81
+ (0, vitest_1.expect)(res.statusCode).toBe(200);
82
+ const data = JSON.parse(res.body);
83
+ (0, vitest_1.expect)(data.games).toEqual([]);
84
+ });
85
+ (0, vitest_1.it)('GET /api/games should list loaded games', async () => {
86
+ const zipPath = await createTestZip(tmpDir, 'game.zip');
87
+ await manager.loadZip(zipPath);
88
+ const res = await makeRequest(server, 'GET', '/api/games');
89
+ const data = JSON.parse(res.body);
90
+ (0, vitest_1.expect)(data.games).toHaveLength(1);
91
+ (0, vitest_1.expect)(data.games[0].name).toBe('Test Game');
92
+ });
93
+ (0, vitest_1.it)('DELETE /api/games/:id should remove a game', async () => {
94
+ const zipPath = await createTestZip(tmpDir, 'game.zip');
95
+ const entry = await manager.loadZip(zipPath);
96
+ const res = await makeRequest(server, 'DELETE', `/api/games/${entry.id}`);
97
+ (0, vitest_1.expect)(res.statusCode).toBe(200);
98
+ (0, vitest_1.expect)(manager.listGames()).toHaveLength(0);
99
+ });
100
+ (0, vitest_1.it)('DELETE /api/games/:id should 404 for unknown id', async () => {
101
+ const res = await makeRequest(server, 'DELETE', '/api/games/nonexistent');
102
+ (0, vitest_1.expect)(res.statusCode).toBe(404);
103
+ });
104
+ (0, vitest_1.it)('should 404 for unknown routes', async () => {
105
+ const res = await makeRequest(server, 'GET', '/api/unknown');
106
+ (0, vitest_1.expect)(res.statusCode).toBe(404);
107
+ });
108
+ });
109
+ //# sourceMappingURL=games-api.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"games-api.test.js","sourceRoot":"","sources":["../../src/__tests__/games-api.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=lan-address.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lan-address.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/lan-address.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const lan_address_1 = require("../server/lan-address");
5
+ (0, vitest_1.describe)('getLanAddress', () => {
6
+ (0, vitest_1.it)('should return a string or null', () => {
7
+ const result = (0, lan_address_1.getLanAddress)();
8
+ if (result !== null) {
9
+ (0, vitest_1.expect)(result).toMatch(/^\d+\.\d+\.\d+\.\d+$/);
10
+ (0, vitest_1.expect)(result).not.toBe('127.0.0.1');
11
+ }
12
+ });
13
+ });
14
+ //# sourceMappingURL=lan-address.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lan-address.test.js","sourceRoot":"","sources":["../../src/__tests__/lan-address.test.ts"],"names":[],"mappings":";;AAAA,mCAA8C;AAC9C,uDAAsD;AAEtD,IAAA,iBAAQ,EAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,IAAA,WAAE,EAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,MAAM,GAAG,IAAA,2BAAa,GAAE,CAAC;QAC/B,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YACpB,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;YAC/C,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACvC,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=validate-demo.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-demo.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/validate-demo.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,73 @@
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 vitest_1 = require("vitest");
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const os_1 = __importDefault(require("os"));
10
+ const validate_demo_1 = require("../utils/validate-demo");
11
+ (0, vitest_1.describe)('validateDemo', () => {
12
+ let tmpDir;
13
+ let demoDistDir;
14
+ (0, vitest_1.beforeEach)(() => {
15
+ tmpDir = fs_1.default.mkdtempSync(path_1.default.join(os_1.default.tmpdir(), 'validate-demo-'));
16
+ demoDistDir = path_1.default.join(tmpDir, 'demo', 'dist');
17
+ fs_1.default.mkdirSync(demoDistDir, { recursive: true });
18
+ });
19
+ (0, vitest_1.afterEach)(() => {
20
+ fs_1.default.rmSync(tmpDir, { recursive: true, force: true });
21
+ });
22
+ (0, vitest_1.it)('should fail when demo/dist does not exist', () => {
23
+ const result = (0, validate_demo_1.validateDemo)(path_1.default.join(tmpDir, 'nonexistent'));
24
+ (0, vitest_1.expect)(result.valid).toBe(false);
25
+ (0, vitest_1.expect)(result.errors[0]).toContain('demo/dist/index.html not found');
26
+ });
27
+ (0, vitest_1.it)('should fail when index.html is missing', () => {
28
+ const emptyDir = path_1.default.join(tmpDir, 'empty-demo');
29
+ fs_1.default.mkdirSync(emptyDir, { recursive: true });
30
+ const result = (0, validate_demo_1.validateDemo)(emptyDir);
31
+ (0, vitest_1.expect)(result.valid).toBe(false);
32
+ (0, vitest_1.expect)(result.errors[0]).toContain('demo/dist/index.html not found');
33
+ });
34
+ (0, vitest_1.it)('should pass with relative paths', () => {
35
+ fs_1.default.writeFileSync(path_1.default.join(demoDistDir, 'index.html'), '<html><head><link href="./assets/style.css" rel="stylesheet"></head>' +
36
+ '<body><script src="./assets/index.js"></script></body></html>');
37
+ const result = (0, validate_demo_1.validateDemo)(demoDistDir);
38
+ (0, vitest_1.expect)(result.valid).toBe(true);
39
+ (0, vitest_1.expect)(result.errors).toHaveLength(0);
40
+ });
41
+ (0, vitest_1.it)('should fail with absolute src path', () => {
42
+ fs_1.default.writeFileSync(path_1.default.join(demoDistDir, 'index.html'), '<html><body><script type="module" crossorigin src="/assets/index-C0AShmvx.js"></script></body></html>');
43
+ const result = (0, validate_demo_1.validateDemo)(demoDistDir);
44
+ (0, vitest_1.expect)(result.valid).toBe(false);
45
+ (0, vitest_1.expect)(result.errors[0]).toContain('absolute path references');
46
+ (0, vitest_1.expect)(result.errors[0]).toContain('base: "./"');
47
+ });
48
+ (0, vitest_1.it)('should fail with absolute href path', () => {
49
+ fs_1.default.writeFileSync(path_1.default.join(demoDistDir, 'index.html'), '<html><head><link rel="stylesheet" href="/assets/index-abc123.css"></head></html>');
50
+ const result = (0, validate_demo_1.validateDemo)(demoDistDir);
51
+ (0, vitest_1.expect)(result.valid).toBe(false);
52
+ (0, vitest_1.expect)(result.errors[0]).toContain('absolute path references');
53
+ });
54
+ (0, vitest_1.it)('should detect multiple absolute path references', () => {
55
+ fs_1.default.writeFileSync(path_1.default.join(demoDistDir, 'index.html'), '<html><head><link href="/assets/style.css" rel="stylesheet"></head>' +
56
+ '<body><script src="/assets/index.js"></script></body></html>');
57
+ const result = (0, validate_demo_1.validateDemo)(demoDistDir);
58
+ (0, vitest_1.expect)(result.valid).toBe(false);
59
+ (0, vitest_1.expect)(result.errors[0]).toContain('href="/');
60
+ (0, vitest_1.expect)(result.errors[0]).toContain('src="/');
61
+ });
62
+ (0, vitest_1.it)('should allow protocol-relative URLs (//)', () => {
63
+ fs_1.default.writeFileSync(path_1.default.join(demoDistDir, 'index.html'), '<html><body><script src="//cdn.example.com/lib.js"></script></body></html>');
64
+ const result = (0, validate_demo_1.validateDemo)(demoDistDir);
65
+ (0, vitest_1.expect)(result.valid).toBe(true);
66
+ });
67
+ (0, vitest_1.it)('should allow full URLs', () => {
68
+ fs_1.default.writeFileSync(path_1.default.join(demoDistDir, 'index.html'), '<html><body><script src="https://cdn.example.com/lib.js"></script></body></html>');
69
+ const result = (0, validate_demo_1.validateDemo)(demoDistDir);
70
+ (0, vitest_1.expect)(result.valid).toBe(true);
71
+ });
72
+ });
73
+ //# sourceMappingURL=validate-demo.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-demo.test.js","sourceRoot":"","sources":["../../src/__tests__/validate-demo.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=zip-manager.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zip-manager.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/zip-manager.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,111 @@
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
+ // packages/dev-kit/src/__tests__/zip-manager.test.ts
7
+ const vitest_1 = require("vitest");
8
+ const zip_manager_1 = require("../server/zip-manager");
9
+ const path_1 = __importDefault(require("path"));
10
+ const fs_1 = __importDefault(require("fs"));
11
+ const os_1 = __importDefault(require("os"));
12
+ const archiver_1 = __importDefault(require("archiver"));
13
+ async function createTestZip(dir, filename, options) {
14
+ const zipPath = path_1.default.join(dir, filename);
15
+ const output = fs_1.default.createWriteStream(zipPath);
16
+ const archive = (0, archiver_1.default)('zip');
17
+ archive.pipe(output);
18
+ if (!options?.skipManifest) {
19
+ archive.append(JSON.stringify({
20
+ name: 'Test Game', description: 'A test game', version: '1.0.0', sdkVersion: '2.0.0',
21
+ minPlayers: 2, maxPlayers: 6, tags: ['test'],
22
+ assets: { icon: 'icon.png', banner: 'banner.png', cover: 'cover.png', splash: 'splash.png' },
23
+ rules: 'rules.md',
24
+ }), { name: 'manifest.json' });
25
+ }
26
+ if (!options?.skipEngine) {
27
+ archive.append(`module.exports = { engine: {
28
+ init(players) { return { players: players.map(p => p.id), turn: 0 }; },
29
+ handleAction(state, pid, action) { return { ...state, turn: state.turn + 1 }; },
30
+ isGameOver(state) { return state.turn >= 3; },
31
+ getResult(state) { return { winner: state.players[0] }; },
32
+ getPlayerView(state, pid) { return state; },
33
+ }};`, { name: 'engine.cjs' });
34
+ }
35
+ if (!options?.skipBundle) {
36
+ archive.append('// bundle.js\nconsole.log("game");', { name: 'bundle.js' });
37
+ }
38
+ archive.append(Buffer.from('PNG'), { name: 'icon.png' });
39
+ archive.append(Buffer.from('sprite data'), { name: 'assets/sprite.png' });
40
+ await archive.finalize();
41
+ await new Promise((resolve) => output.on('close', resolve));
42
+ return zipPath;
43
+ }
44
+ (0, vitest_1.describe)('ZipManager', () => {
45
+ let tmpDir;
46
+ let manager;
47
+ (0, vitest_1.beforeEach)(() => {
48
+ tmpDir = fs_1.default.mkdtempSync(path_1.default.join(os_1.default.tmpdir(), 'lpt-zip-test-'));
49
+ manager = new zip_manager_1.ZipManager();
50
+ });
51
+ (0, vitest_1.afterEach)(() => {
52
+ manager.cleanup();
53
+ fs_1.default.rmSync(tmpDir, { recursive: true, force: true });
54
+ });
55
+ (0, vitest_1.it)('should load a valid ZIP file', async () => {
56
+ const zipPath = await createTestZip(tmpDir, 'game.zip');
57
+ const entry = await manager.loadZip(zipPath);
58
+ (0, vitest_1.expect)(entry.name).toBe('Test Game');
59
+ (0, vitest_1.expect)(entry.version).toBe('1.0.0');
60
+ (0, vitest_1.expect)(entry.minPlayers).toBe(2);
61
+ (0, vitest_1.expect)(entry.maxPlayers).toBe(6);
62
+ (0, vitest_1.expect)(fs_1.default.existsSync(entry.enginePath)).toBe(true);
63
+ (0, vitest_1.expect)(fs_1.default.existsSync(entry.bundlePath)).toBe(true);
64
+ });
65
+ (0, vitest_1.it)('should list loaded games', async () => {
66
+ await manager.loadZip(await createTestZip(tmpDir, 'game1.zip'));
67
+ await manager.loadZip(await createTestZip(tmpDir, 'game2.zip'));
68
+ (0, vitest_1.expect)(manager.listGames()).toHaveLength(2);
69
+ });
70
+ (0, vitest_1.it)('should get a game by id', async () => {
71
+ const entry = await manager.loadZip(await createTestZip(tmpDir, 'game.zip'));
72
+ (0, vitest_1.expect)(manager.getGame(entry.id)).toBe(entry);
73
+ (0, vitest_1.expect)(manager.getGame('nonexistent')).toBeUndefined();
74
+ });
75
+ (0, vitest_1.it)('should remove a game and clean up temp files', async () => {
76
+ const entry = await manager.loadZip(await createTestZip(tmpDir, 'game.zip'));
77
+ const extractDir = entry.extractDir;
78
+ (0, vitest_1.expect)(fs_1.default.existsSync(extractDir)).toBe(true);
79
+ manager.removeGame(entry.id);
80
+ (0, vitest_1.expect)(manager.getGame(entry.id)).toBeUndefined();
81
+ (0, vitest_1.expect)(fs_1.default.existsSync(extractDir)).toBe(false);
82
+ });
83
+ (0, vitest_1.it)('should reject ZIP missing engine.cjs', async () => {
84
+ const zipPath = await createTestZip(tmpDir, 'bad.zip', { skipEngine: true });
85
+ await (0, vitest_1.expect)(manager.loadZip(zipPath)).rejects.toThrow('engine.cjs');
86
+ });
87
+ (0, vitest_1.it)('should reject ZIP missing bundle.js', async () => {
88
+ const zipPath = await createTestZip(tmpDir, 'bad.zip', { skipBundle: true });
89
+ await (0, vitest_1.expect)(manager.loadZip(zipPath)).rejects.toThrow('bundle.js');
90
+ });
91
+ (0, vitest_1.it)('should reject ZIP missing manifest.json', async () => {
92
+ const zipPath = await createTestZip(tmpDir, 'bad.zip', { skipManifest: true });
93
+ await (0, vitest_1.expect)(manager.loadZip(zipPath)).rejects.toThrow('manifest.json');
94
+ });
95
+ (0, vitest_1.it)('should load from buffer (upload simulation)', async () => {
96
+ const zipPath = await createTestZip(tmpDir, 'game.zip');
97
+ const buffer = fs_1.default.readFileSync(zipPath);
98
+ const entry = await manager.loadFromUpload(buffer, 'uploaded-game.zip');
99
+ (0, vitest_1.expect)(entry.name).toBe('Test Game');
100
+ (0, vitest_1.expect)(fs_1.default.existsSync(entry.enginePath)).toBe(true);
101
+ });
102
+ (0, vitest_1.it)('should clean up all temp directories on cleanup()', async () => {
103
+ const e1 = await manager.loadZip(await createTestZip(tmpDir, 'game1.zip'));
104
+ const e2 = await manager.loadZip(await createTestZip(tmpDir, 'game2.zip'));
105
+ manager.cleanup();
106
+ (0, vitest_1.expect)(fs_1.default.existsSync(e1.extractDir)).toBe(false);
107
+ (0, vitest_1.expect)(fs_1.default.existsSync(e2.extractDir)).toBe(false);
108
+ (0, vitest_1.expect)(manager.listGames()).toHaveLength(0);
109
+ });
110
+ });
111
+ //# sourceMappingURL=zip-manager.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zip-manager.test.js","sourceRoot":"","sources":["../../src/__tests__/zip-manager.test.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,QAAA,MAAM,OAAO,QAAkB,CAAC;AAEhC,iBAAe,IAAI,kBAoBlB"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,QAAA,MAAM,OAAO,QAAkB,CAAC;AAEhC,iBAAe,IAAI,kBAuClB"}
package/dist/cli.js CHANGED
@@ -46,11 +46,30 @@ async function main() {
46
46
  await devCommand(process.cwd());
47
47
  break;
48
48
  }
49
+ case 'play': {
50
+ const { playCommand } = await Promise.resolve().then(() => __importStar(require('./commands/play')));
51
+ // Parse --dir, --port, --socketPort from argv
52
+ const args = process.argv.slice(3);
53
+ const options = {};
54
+ for (let i = 0; i < args.length; i++) {
55
+ if (args[i].startsWith('--') && i + 1 < args.length) {
56
+ options[args[i].slice(2)] = args[i + 1];
57
+ i++;
58
+ }
59
+ }
60
+ await playCommand({
61
+ dir: options.dir,
62
+ port: options.port ? Number(options.port) : undefined,
63
+ socketPort: options.socketPort ? Number(options.socketPort) : undefined,
64
+ });
65
+ break;
66
+ }
49
67
  default:
50
68
  console.log('Usage: lpt-dev-kit <command>');
51
69
  console.log('');
52
70
  console.log('Commands:');
53
71
  console.log(' dev Start development server');
72
+ console.log(' play Load and test game ZIP packages');
54
73
  console.log(' pack Build and package game as .zip');
55
74
  process.exit(command ? 1 : 0);
56
75
  }
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAEhC,KAAK,UAAU,IAAI;IACjB,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,EAAE,WAAW,EAAE,GAAG,wDAAa,iBAAiB,GAAC,CAAC;YACxD,MAAM,WAAW,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;YACjC,MAAM;QACR,CAAC;QACD,KAAK,KAAK,CAAC,CAAC,CAAC;YACX,MAAM,EAAE,UAAU,EAAE,GAAG,wDAAa,gBAAgB,GAAC,CAAC;YACtD,MAAM,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;YAChC,MAAM;QACR,CAAC;QACD;YACE,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;YAC5C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;YAClD,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;YACxD,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC3B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAEhC,KAAK,UAAU,IAAI;IACjB,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,EAAE,WAAW,EAAE,GAAG,wDAAa,iBAAiB,GAAC,CAAC;YACxD,MAAM,WAAW,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;YACjC,MAAM;QACR,CAAC;QACD,KAAK,KAAK,CAAC,CAAC,CAAC;YACX,MAAM,EAAE,UAAU,EAAE,GAAG,wDAAa,gBAAgB,GAAC,CAAC;YACtD,MAAM,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;YAChC,MAAM;QACR,CAAC;QACD,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,EAAE,WAAW,EAAE,GAAG,wDAAa,iBAAiB,GAAC,CAAC;YACxD,8CAA8C;YAC9C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACnC,MAAM,OAAO,GAA2B,EAAE,CAAC;YAC3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACrC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;oBACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;oBACxC,CAAC,EAAE,CAAC;gBACN,CAAC;YACH,CAAC;YACD,MAAM,WAAW,CAAC;gBAChB,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;gBACrD,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS;aACxE,CAAC,CAAC;YACH,MAAM;QACR,CAAC;QACD;YACE,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;YAC5C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;YAClD,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;YACzD,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;YACxD,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC3B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AAoGA,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,GAAE,UAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CAoFvG"}
1
+ {"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AAqGA,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,GAAE,UAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CA8FvG"}
@@ -9,6 +9,7 @@ const path_1 = __importDefault(require("path"));
9
9
  const fs_1 = __importDefault(require("fs"));
10
10
  const vite_1 = require("vite");
11
11
  const socket_server_1 = require("../server/socket-server");
12
+ const lan_address_1 = require("../server/lan-address");
12
13
  const chokidar_1 = __importDefault(require("chokidar"));
13
14
  const MIME_TYPES = {
14
15
  '.png': 'image/png',
@@ -139,10 +140,15 @@ async function devCommand(projectDir, options = {}) {
139
140
  plugins: [react(), serveGameAssets(projectDir)],
140
141
  server: {
141
142
  port,
143
+ host: '0.0.0.0',
142
144
  fs: {
143
145
  allow: [webappDir, projectDir],
144
146
  },
145
147
  },
148
+ define: {
149
+ __SOCKET_PORT__: JSON.stringify(socketPort),
150
+ __DEV_KIT_MODE__: JSON.stringify('dev'),
151
+ },
146
152
  resolve: {
147
153
  alias: {
148
154
  '/src': path_1.default.join(projectDir, 'src'),
@@ -152,10 +158,15 @@ async function devCommand(projectDir, options = {}) {
152
158
  });
153
159
  await vite.listen();
154
160
  if (!options.silent) {
161
+ const lanIp = (0, lan_address_1.getLanAddress)();
155
162
  console.log(` Preview: http://localhost:${port}/preview`);
156
163
  console.log(` Multiplayer: http://localhost:${port}/play`);
157
164
  console.log(` Debug Panel: http://localhost:${port}/debug`);
158
165
  console.log(` Socket.IO: ws://localhost:${socketPort}`);
166
+ if (lanIp) {
167
+ console.log('');
168
+ console.log(` LAN: http://${lanIp}:${port}`);
169
+ }
159
170
  console.log('');
160
171
  console.log(' Press Ctrl+C to stop');
161
172
  console.log('');
@@ -1 +1 @@
1
- {"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":";;;;;AAgHA,gCAoFC;AApMD,uCAAuC;AACvC,gDAAwB;AACxB,4CAAoB;AACpB,+BAAkE;AAClE,2DAA6D;AAC7D,wDAAgC;AAEhC,MAAM,UAAU,GAA2B;IACzC,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,YAAY;IACpB,OAAO,EAAE,YAAY;IACrB,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,eAAe;IACvB,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,YAAY;IACpB,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,WAAW;IACnB,OAAO,EAAE,kBAAkB;IAC3B,QAAQ,EAAE,YAAY;IACtB,OAAO,EAAE,WAAW;CACrB,CAAC;AAEF;;;;;GAKG;AACH,SAAS,eAAe,CAAC,UAAkB;IACzC,OAAO;QACL,IAAI,EAAE,mBAAmB;QACzB,eAAe,CAAC,MAAM;YACpB,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;gBACxC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC;oBAAE,OAAO,IAAI,EAAE,CAAC;gBAE/D,MAAM,YAAY,GAAG,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;gBACtD,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;gBAE/D,8BAA8B;gBAC9B,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC;oBAC1D,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;oBACrB,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;oBACrB,OAAO;gBACT,CAAC;gBAED,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;oBAChE,OAAO,IAAI,EAAE,CAAC;gBAChB,CAAC;gBAED,MAAM,GAAG,GAAG,cAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;gBACjD,MAAM,WAAW,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,0BAA0B,CAAC;gBAClE,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;gBAC3C,YAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC1C,CAAC,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAAC,UAAkB,EAAE,MAAe;IAChE,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,YAAY,GAAG,KAAK,CAAC;IACzB,IAAI,aAAa,GAAyC,IAAI,CAAC;IAE/D,KAAK,UAAU,QAAQ;QACrB,IAAI,QAAQ,EAAE,CAAC;YACb,YAAY,GAAG,IAAI,CAAC;YACpB,OAAO;QACT,CAAC;QACD,QAAQ,GAAG,IAAI,CAAC;QAChB,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;QAC5D,CAAC;QACD,IAAI,CAAC;YACH,MAAM,IAAA,YAAK,EAAC;gBACV,UAAU,EAAE,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,gBAAgB,CAAC;gBACnD,QAAQ,EAAE,MAAM;aACjB,CAAC,CAAC;YACH,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;YAChD,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAG,GAAa,CAAC,OAAO,CAAC,CAAC;QACxE,CAAC;gBAAS,CAAC;YACT,QAAQ,GAAG,KAAK,CAAC;YACjB,IAAI,YAAY,EAAE,CAAC;gBACjB,YAAY,GAAG,KAAK,CAAC;gBACrB,QAAQ,EAAE,CAAC;YACb,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,CAAC,QAAgB,EAAE,EAAE;QAC1B,IAAI,aAAa;YAAE,YAAY,CAAC,aAAa,CAAC,CAAC;QAC/C,aAAa,GAAG,UAAU,CAAC,GAAG,EAAE;YAC9B,aAAa,GAAG,IAAI,CAAC;YACrB,QAAQ,EAAE,CAAC;QACb,CAAC,EAAE,GAAG,CAAC,CAAC;IACV,CAAC,CAAC;AACJ,CAAC;AAcM,KAAK,UAAU,UAAU,CAAC,UAAkB,EAAE,UAAsB,EAAE;IAC3E,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC;IAClC,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC;IAE9C,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IAED,yBAAyB;IACzB,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,YAAY,EAAE,GAAG,IAAA,kCAAkB,EAAC;QACtD,IAAI,EAAE,UAAU;QAChB,UAAU;KACX,CAAC,CAAC;IAEH,0DAA0D;IAC1D,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;IAC/D,MAAM,WAAW,GAAG,kBAAQ,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IACxE,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;QAC5B,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;QACpD,CAAC;QACD,YAAY,EAAE,CAAC;IACjB,CAAC,CAAC,CAAC;IAEH,6CAA6C;IAC7C,MAAM,MAAM,GAAG,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IAC5C,MAAM,UAAU,GAAG,kBAAQ,CAAC,KAAK,CAAC,MAAM,EAAE;QACxC,aAAa,EAAE,IAAI;QACnB,OAAO,EAAE,cAAc;KACxB,CAAC,CAAC;IACH,MAAM,cAAc,GAAG,qBAAqB,CAAC,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3E,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;IACxC,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;IAErC,wBAAwB;IACxB,MAAM,SAAS,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IAEvD,8DAA8D;IAC9D,MAAM,KAAK,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAC,OAAO,CAAC;IAEtD,MAAM,IAAI,GAAkB,MAAM,IAAA,mBAAY,EAAC;QAC7C,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,eAAe,CAAC,UAAU,CAAC,CAAC;QAC/C,MAAM,EAAE;YACN,IAAI;YACJ,EAAE,EAAE;gBACF,KAAK,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC;aAC/B;SACF;QACD,OAAO,EAAE;YACP,KAAK,EAAE;gBACL,MAAM,EAAE,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC;gBACpC,SAAS,EAAE,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC;aAC3C;SACF;KACF,CAAC,CAAC;IAEH,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;IAEpB,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,oCAAoC,IAAI,UAAU,CAAC,CAAC;QAChE,OAAO,CAAC,GAAG,CAAC,oCAAoC,IAAI,OAAO,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,oCAAoC,IAAI,QAAQ,CAAC,CAAC;QAC9D,OAAO,CAAC,GAAG,CAAC,kCAAkC,UAAU,EAAE,CAAC,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IAED,OAAO;QACL,IAAI;QACJ,UAAU;QACV,KAAK,CAAC,IAAI;YACR,MAAM,WAAW,CAAC,KAAK,EAAE,CAAC;YAC1B,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC;YACzB,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;YACnB,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAC3B,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACtE,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":";;;;;AAiHA,gCA8FC;AA/MD,uCAAuC;AACvC,gDAAwB;AACxB,4CAAoB;AACpB,+BAAkE;AAClE,2DAA6D;AAC7D,uDAAsD;AACtD,wDAAgC;AAEhC,MAAM,UAAU,GAA2B;IACzC,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,YAAY;IACpB,OAAO,EAAE,YAAY;IACrB,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,eAAe;IACvB,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,YAAY;IACpB,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,WAAW;IACnB,OAAO,EAAE,kBAAkB;IAC3B,QAAQ,EAAE,YAAY;IACtB,OAAO,EAAE,WAAW;CACrB,CAAC;AAEF;;;;;GAKG;AACH,SAAS,eAAe,CAAC,UAAkB;IACzC,OAAO;QACL,IAAI,EAAE,mBAAmB;QACzB,eAAe,CAAC,MAAM;YACpB,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;gBACxC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC;oBAAE,OAAO,IAAI,EAAE,CAAC;gBAE/D,MAAM,YAAY,GAAG,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;gBACtD,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;gBAE/D,8BAA8B;gBAC9B,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC;oBAC1D,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;oBACrB,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;oBACrB,OAAO;gBACT,CAAC;gBAED,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;oBAChE,OAAO,IAAI,EAAE,CAAC;gBAChB,CAAC;gBAED,MAAM,GAAG,GAAG,cAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;gBACjD,MAAM,WAAW,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,0BAA0B,CAAC;gBAClE,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;gBAC3C,YAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC1C,CAAC,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAAC,UAAkB,EAAE,MAAe;IAChE,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,YAAY,GAAG,KAAK,CAAC;IACzB,IAAI,aAAa,GAAyC,IAAI,CAAC;IAE/D,KAAK,UAAU,QAAQ;QACrB,IAAI,QAAQ,EAAE,CAAC;YACb,YAAY,GAAG,IAAI,CAAC;YACpB,OAAO;QACT,CAAC;QACD,QAAQ,GAAG,IAAI,CAAC;QAChB,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;QAC5D,CAAC;QACD,IAAI,CAAC;YACH,MAAM,IAAA,YAAK,EAAC;gBACV,UAAU,EAAE,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,gBAAgB,CAAC;gBACnD,QAAQ,EAAE,MAAM;aACjB,CAAC,CAAC;YACH,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;YAChD,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAG,GAAa,CAAC,OAAO,CAAC,CAAC;QACxE,CAAC;gBAAS,CAAC;YACT,QAAQ,GAAG,KAAK,CAAC;YACjB,IAAI,YAAY,EAAE,CAAC;gBACjB,YAAY,GAAG,KAAK,CAAC;gBACrB,QAAQ,EAAE,CAAC;YACb,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,CAAC,QAAgB,EAAE,EAAE;QAC1B,IAAI,aAAa;YAAE,YAAY,CAAC,aAAa,CAAC,CAAC;QAC/C,aAAa,GAAG,UAAU,CAAC,GAAG,EAAE;YAC9B,aAAa,GAAG,IAAI,CAAC;YACrB,QAAQ,EAAE,CAAC;QACb,CAAC,EAAE,GAAG,CAAC,CAAC;IACV,CAAC,CAAC;AACJ,CAAC;AAcM,KAAK,UAAU,UAAU,CAAC,UAAkB,EAAE,UAAsB,EAAE;IAC3E,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC;IAClC,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC;IAE9C,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IAED,yBAAyB;IACzB,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,YAAY,EAAE,GAAG,IAAA,kCAAkB,EAAC;QACtD,IAAI,EAAE,UAAU;QAChB,UAAU;KACX,CAAC,CAAC;IAEH,0DAA0D;IAC1D,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;IAC/D,MAAM,WAAW,GAAG,kBAAQ,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IACxE,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;QAC5B,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;QACpD,CAAC;QACD,YAAY,EAAE,CAAC;IACjB,CAAC,CAAC,CAAC;IAEH,6CAA6C;IAC7C,MAAM,MAAM,GAAG,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IAC5C,MAAM,UAAU,GAAG,kBAAQ,CAAC,KAAK,CAAC,MAAM,EAAE;QACxC,aAAa,EAAE,IAAI;QACnB,OAAO,EAAE,cAAc;KACxB,CAAC,CAAC;IACH,MAAM,cAAc,GAAG,qBAAqB,CAAC,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3E,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;IACxC,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;IAErC,wBAAwB;IACxB,MAAM,SAAS,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IAEvD,8DAA8D;IAC9D,MAAM,KAAK,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAC,OAAO,CAAC;IAEtD,MAAM,IAAI,GAAkB,MAAM,IAAA,mBAAY,EAAC;QAC7C,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,eAAe,CAAC,UAAU,CAAC,CAAC;QAC/C,MAAM,EAAE;YACN,IAAI;YACJ,IAAI,EAAE,SAAS;YACf,EAAE,EAAE;gBACF,KAAK,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC;aAC/B;SACF;QACD,MAAM,EAAE;YACN,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;YAC3C,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;SACxC;QACD,OAAO,EAAE;YACP,KAAK,EAAE;gBACL,MAAM,EAAE,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC;gBACpC,SAAS,EAAE,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC;aAC3C;SACF;KACF,CAAC,CAAC;IAEH,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;IAEpB,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACpB,MAAM,KAAK,GAAG,IAAA,2BAAa,GAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,oCAAoC,IAAI,UAAU,CAAC,CAAC;QAChE,OAAO,CAAC,GAAG,CAAC,oCAAoC,IAAI,OAAO,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,oCAAoC,IAAI,QAAQ,CAAC,CAAC;QAC9D,OAAO,CAAC,GAAG,CAAC,kCAAkC,UAAU,EAAE,CAAC,CAAC;QAC5D,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,0BAA0B,KAAK,IAAI,IAAI,EAAE,CAAC,CAAC;QACzD,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IAED,OAAO;QACL,IAAI;QACJ,UAAU;QACV,KAAK,CAAC,IAAI;YACR,MAAM,WAAW,CAAC,KAAK,EAAE,CAAC;YAC1B,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC;YACzB,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;YACnB,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAC3B,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACtE,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"pack.d.ts","sourceRoot":"","sources":["../../src/commands/pack.ts"],"names":[],"mappings":"AASA,wBAAsB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA2LnE"}
1
+ {"version":3,"file":"pack.d.ts","sourceRoot":"","sources":["../../src/commands/pack.ts"],"names":[],"mappings":"AAUA,wBAAsB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA+LnE"}
@@ -11,6 +11,7 @@ const archiver_1 = __importDefault(require("archiver"));
11
11
  const validate_bundle_1 = require("../utils/validate-bundle");
12
12
  const validate_assets_1 = require("../utils/validate-assets");
13
13
  const validate_game_assets_1 = require("../utils/validate-game-assets");
14
+ const validate_demo_1 = require("../utils/validate-demo");
14
15
  const manifest_1 = require("../utils/manifest");
15
16
  async function packCommand(projectDir) {
16
17
  const distDir = path_1.default.join(projectDir, 'dist');
@@ -125,9 +126,11 @@ async function packCommand(projectDir) {
125
126
  const demoDistDir = path_1.default.join(projectDir, 'demo', 'dist');
126
127
  let hasDemo = false;
127
128
  if (demo) {
128
- if (!fs_1.default.existsSync(demoDistDir) || !fs_1.default.existsSync(path_1.default.join(demoDistDir, 'index.html'))) {
129
- console.error(' ERROR: GameConfig.demo is set but demo/dist/index.html not found.');
130
- console.error(' Build your demo site first: cd demo && npm run build');
129
+ const demoResult = (0, validate_demo_1.validateDemo)(demoDistDir);
130
+ if (!demoResult.valid) {
131
+ for (const error of demoResult.errors) {
132
+ console.error(` ERROR: ${error}`);
133
+ }
131
134
  process.exit(1);
132
135
  }
133
136
  hasDemo = true;