@vylos/core 0.1.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 (75) hide show
  1. package/package.json +34 -0
  2. package/src/components/app/EngineView.vue +40 -0
  3. package/src/components/app/GameShell.vue +265 -0
  4. package/src/components/app/LoadingScreen.vue +10 -0
  5. package/src/components/app/MainMenu.vue +243 -0
  6. package/src/components/core/BackgroundLayer.vue +27 -0
  7. package/src/components/core/ChoicePanel.vue +115 -0
  8. package/src/components/core/CustomOverlay.vue +27 -0
  9. package/src/components/core/DialogueBox.vue +144 -0
  10. package/src/components/core/DrawableOverlay.vue +109 -0
  11. package/src/components/core/ForegroundLayer.vue +31 -0
  12. package/src/components/menu/ActionOverlay.vue +126 -0
  13. package/src/components/menu/LocationOverlay.vue +136 -0
  14. package/src/components/menu/PauseMenu.vue +196 -0
  15. package/src/components/menu/SaveLoadMenu.vue +377 -0
  16. package/src/components/menu/SettingsMenu.vue +111 -0
  17. package/src/components/menu/TopBar.vue +65 -0
  18. package/src/composables/useConfig.ts +4 -0
  19. package/src/composables/useEngine.ts +16 -0
  20. package/src/composables/useGameState.ts +9 -0
  21. package/src/composables/useLanguage.ts +31 -0
  22. package/src/engine/core/CheckpointManager.ts +122 -0
  23. package/src/engine/core/Engine.ts +272 -0
  24. package/src/engine/core/EngineFactory.ts +102 -0
  25. package/src/engine/core/EventRunner.ts +488 -0
  26. package/src/engine/errors/EventEndError.ts +7 -0
  27. package/src/engine/errors/InterruptSignal.ts +10 -0
  28. package/src/engine/errors/JumpSignal.ts +10 -0
  29. package/src/engine/errors/StateValidationError.ts +13 -0
  30. package/src/engine/managers/ActionManager.ts +62 -0
  31. package/src/engine/managers/EventManager.ts +166 -0
  32. package/src/engine/managers/HistoryManager.ts +84 -0
  33. package/src/engine/managers/InputManager.ts +117 -0
  34. package/src/engine/managers/LanguageManager.ts +51 -0
  35. package/src/engine/managers/LocationManager.ts +76 -0
  36. package/src/engine/managers/NavigationManager.ts +75 -0
  37. package/src/engine/managers/SaveManager.ts +86 -0
  38. package/src/engine/managers/SettingsManager.ts +70 -0
  39. package/src/engine/managers/WaitManager.ts +47 -0
  40. package/src/engine/schemas/baseGameState.schema.ts +19 -0
  41. package/src/engine/schemas/checkpoint.schema.ts +11 -0
  42. package/src/engine/schemas/engineState.schema.ts +59 -0
  43. package/src/engine/schemas/location.schema.ts +21 -0
  44. package/src/engine/storage/VylosStorage.ts +131 -0
  45. package/src/engine/types/actions.ts +20 -0
  46. package/src/engine/types/checkpoint.ts +31 -0
  47. package/src/engine/types/config.ts +9 -0
  48. package/src/engine/types/dialogue.ts +15 -0
  49. package/src/engine/types/engine.ts +85 -0
  50. package/src/engine/types/events.ts +117 -0
  51. package/src/engine/types/game-state.ts +15 -0
  52. package/src/engine/types/index.ts +10 -0
  53. package/src/engine/types/locations.ts +32 -0
  54. package/src/engine/types/plugin.ts +11 -0
  55. package/src/engine/types/save.ts +40 -0
  56. package/src/engine/utils/TimeHelper.ts +39 -0
  57. package/src/engine/utils/logger.ts +43 -0
  58. package/src/env.d.ts +17 -0
  59. package/src/index.ts +74 -0
  60. package/src/stores/engineState.ts +127 -0
  61. package/src/stores/gameState.ts +49 -0
  62. package/tests/engine/ActionManager.test.ts +94 -0
  63. package/tests/engine/CheckpointManager.test.ts +136 -0
  64. package/tests/engine/EventManager.test.ts +145 -0
  65. package/tests/engine/EventRunner.test.ts +318 -0
  66. package/tests/engine/HistoryManager.test.ts +113 -0
  67. package/tests/engine/LocationManager.test.ts +128 -0
  68. package/tests/engine/schemas.test.ts +250 -0
  69. package/tests/engine/utils.test.ts +75 -0
  70. package/tests/integration/game-loop.test.ts +201 -0
  71. package/tests/safety/event-validation.test.ts +102 -0
  72. package/tests/safety/state-schema.test.ts +96 -0
  73. package/tests/setup.ts +2 -0
  74. package/tsconfig.json +14 -0
  75. package/vitest.config.ts +16 -0
@@ -0,0 +1,96 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { baseGameStateSchema, extendGameStateSchema } from '../../src/engine/schemas/baseGameState.schema';
3
+ import { StateValidationError } from '../../src/engine/errors/StateValidationError';
4
+ import { z } from 'zod';
5
+
6
+ describe('State validation safety', () => {
7
+ it('catches type coercion attempts', () => {
8
+ const result = baseGameStateSchema.safeParse({
9
+ locationId: 123, // should be string
10
+ gameTime: '8', // should be number
11
+ flags: {},
12
+ counters: {},
13
+ player: { name: 'Alice' },
14
+ });
15
+ expect(result.success).toBe(false);
16
+ });
17
+
18
+ it('catches extra properties in strict mode', () => {
19
+ const strict = baseGameStateSchema.strict();
20
+ const result = strict.safeParse({
21
+ locationId: 'cafe',
22
+ gameTime: 8,
23
+ flags: {},
24
+ counters: {},
25
+ player: { name: 'Alice' },
26
+ hacked: true,
27
+ });
28
+ expect(result.success).toBe(false);
29
+ });
30
+
31
+ it('StateValidationError formats issues nicely', () => {
32
+ const result = baseGameStateSchema.safeParse({
33
+ locationId: '',
34
+ gameTime: -1,
35
+ flags: {},
36
+ counters: {},
37
+ player: { name: '' },
38
+ });
39
+
40
+ expect(result.success).toBe(false);
41
+ if (!result.success) {
42
+ const error = new StateValidationError(result.error);
43
+ expect(error.message).toContain('State validation failed');
44
+ expect(error.name).toBe('StateValidationError');
45
+ expect(error.zodError).toBe(result.error);
46
+ }
47
+ });
48
+
49
+ it('validates extended schema rejects base-only data', () => {
50
+ const schema = extendGameStateSchema({
51
+ reputation: z.number().min(0).max(100),
52
+ });
53
+
54
+ const result = schema.safeParse({
55
+ locationId: 'cafe',
56
+ gameTime: 8,
57
+ flags: {},
58
+ counters: {},
59
+ player: { name: 'Alice' },
60
+ // missing reputation
61
+ });
62
+ expect(result.success).toBe(false);
63
+ });
64
+
65
+ it('validates extended schema accepts complete data', () => {
66
+ const schema = extendGameStateSchema({
67
+ reputation: z.number().min(0).max(100),
68
+ });
69
+
70
+ const result = schema.safeParse({
71
+ locationId: 'cafe',
72
+ gameTime: 8,
73
+ flags: {},
74
+ counters: {},
75
+ player: { name: 'Alice' },
76
+ reputation: 50,
77
+ });
78
+ expect(result.success).toBe(true);
79
+ });
80
+
81
+ it('validates extended schema rejects out-of-range custom field', () => {
82
+ const schema = extendGameStateSchema({
83
+ reputation: z.number().min(0).max(100),
84
+ });
85
+
86
+ const result = schema.safeParse({
87
+ locationId: 'cafe',
88
+ gameTime: 8,
89
+ flags: {},
90
+ counters: {},
91
+ player: { name: 'Alice' },
92
+ reputation: 150,
93
+ });
94
+ expect(result.success).toBe(false);
95
+ });
96
+ });
package/tests/setup.ts ADDED
@@ -0,0 +1,2 @@
1
+ import 'reflect-metadata';
2
+ import 'fake-indexeddb/auto';
package/tsconfig.json ADDED
@@ -0,0 +1,14 @@
1
+ {
2
+ "extends": "../../tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "outDir": "./dist",
5
+ "rootDir": "./src",
6
+ "jsx": "preserve",
7
+ "types": ["vitest/globals"],
8
+ "paths": {
9
+ "@vylos/*": ["./src/*"]
10
+ }
11
+ },
12
+ "include": ["src/**/*.ts", "src/**/*.vue", "tests/**/*.ts"],
13
+ "exclude": ["node_modules", "dist"]
14
+ }
@@ -0,0 +1,16 @@
1
+ import { defineConfig } from 'vitest/config';
2
+ import { resolve } from 'path';
3
+
4
+ export default defineConfig({
5
+ test: {
6
+ globals: true,
7
+ environment: 'happy-dom',
8
+ include: ['tests/**/*.test.ts'],
9
+ setupFiles: ['./tests/setup.ts'],
10
+ },
11
+ resolve: {
12
+ alias: {
13
+ '@vylos': resolve(__dirname, 'src'),
14
+ },
15
+ },
16
+ });