@omnitronix/lucky-sharky-game-engine 1.0.3 → 1.0.4

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 (30) hide show
  1. package/README.md +1 -3
  2. package/dist/__tests__/comprehensive.test.d.ts +15 -0
  3. package/dist/__tests__/comprehensive.test.d.ts.map +1 -0
  4. package/dist/__tests__/comprehensive.test.js +510 -0
  5. package/dist/__tests__/comprehensive.test.js.map +1 -0
  6. package/dist/__tests__/debug-trigger-bonus.test.d.ts +8 -0
  7. package/dist/__tests__/debug-trigger-bonus.test.d.ts.map +1 -0
  8. package/dist/__tests__/{cheat-trigger-bonus.test.js → debug-trigger-bonus.test.js} +71 -73
  9. package/dist/__tests__/debug-trigger-bonus.test.js.map +1 -0
  10. package/dist/domain/types/debug-trigger-bonus-command.d.ts +10 -0
  11. package/dist/domain/types/debug-trigger-bonus-command.d.ts.map +1 -0
  12. package/dist/domain/types/{cheat-trigger-bonus-command.js → debug-trigger-bonus-command.js} +1 -1
  13. package/dist/domain/types/debug-trigger-bonus-command.js.map +1 -0
  14. package/dist/logic/lucky-sharky.game-logic.d.ts +9 -5
  15. package/dist/logic/lucky-sharky.game-logic.d.ts.map +1 -1
  16. package/dist/logic/lucky-sharky.game-logic.js +36 -5
  17. package/dist/logic/lucky-sharky.game-logic.js.map +1 -1
  18. package/dist/logic/lucky-sharky.types.d.ts +1 -0
  19. package/dist/logic/lucky-sharky.types.d.ts.map +1 -1
  20. package/dist/logic/lucky-sharky.types.js.map +1 -1
  21. package/dist/lucky-sharky-v1.game-engine.d.ts.map +1 -1
  22. package/dist/lucky-sharky-v1.game-engine.js +10 -22
  23. package/dist/lucky-sharky-v1.game-engine.js.map +1 -1
  24. package/package.json +1 -1
  25. package/dist/__tests__/cheat-trigger-bonus.test.d.ts +0 -10
  26. package/dist/__tests__/cheat-trigger-bonus.test.d.ts.map +0 -1
  27. package/dist/__tests__/cheat-trigger-bonus.test.js.map +0 -1
  28. package/dist/domain/types/cheat-trigger-bonus-command.d.ts +0 -15
  29. package/dist/domain/types/cheat-trigger-bonus-command.d.ts.map +0 -1
  30. package/dist/domain/types/cheat-trigger-bonus-command.js.map +0 -1
package/README.md CHANGED
@@ -87,9 +87,7 @@ The engine supports debug commands for QA testing via the dev-tools service. The
87
87
 
88
88
  ### DEBUG_TRIGGER_BONUS
89
89
 
90
- Force trigger a specific bonus round for testing.
91
-
92
- > **Note:** `CHEAT_TRIGGER_BONUS` is supported for backward compatibility but deprecated. Use `DEBUG_TRIGGER_BONUS` for GLI-19 compliance.
90
+ Force trigger a specific bonus round for testing. GLI-19 compliant terminology.
93
91
 
94
92
  **Payload:**
95
93
  ```typescript
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Comprehensive Test Suite for Lucky Sharky Game Engine
3
+ *
4
+ * Coverage:
5
+ * - Session initialization
6
+ * - Base game spins
7
+ * - FREE_SPINS bonus
8
+ * - HOLD_WIN_BONUS (Hold & Win)
9
+ * - Debug triggers
10
+ * - Reality check flow
11
+ * - Connection loss/resume
12
+ * - Error handling
13
+ */
14
+ export {};
15
+ //# sourceMappingURL=comprehensive.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comprehensive.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/comprehensive.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG"}
@@ -0,0 +1,510 @@
1
+ "use strict";
2
+ /**
3
+ * Comprehensive Test Suite for Lucky Sharky Game Engine
4
+ *
5
+ * Coverage:
6
+ * - Session initialization
7
+ * - Base game spins
8
+ * - FREE_SPINS bonus
9
+ * - HOLD_WIN_BONUS (Hold & Win)
10
+ * - Debug triggers
11
+ * - Reality check flow
12
+ * - Connection loss/resume
13
+ * - Error handling
14
+ */
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ const lucky_sharky_v1_game_engine_1 = require("../lucky-sharky-v1.game-engine");
17
+ describe('Lucky Sharky - Comprehensive Test Suite', () => {
18
+ let engine;
19
+ beforeEach(() => {
20
+ engine = new lucky_sharky_v1_game_engine_1.LuckySharkyV1GameEngine();
21
+ });
22
+ // ============================================================
23
+ // SESSION INITIALIZATION
24
+ // ============================================================
25
+ describe('Session Initialization', () => {
26
+ it('should initialize session with default config', async () => {
27
+ const command = {
28
+ id: 'init-1',
29
+ type: 'INIT_SESSION_STATE',
30
+ payload: {
31
+ betAmountThresholds: [0.2, 0.4, 1.0, 2.0, 5.0, 10.0],
32
+ defaultBetAmount: 1.0,
33
+ },
34
+ };
35
+ const result = await engine.processCommand(null, null, command);
36
+ expect(result.success).toBe(true);
37
+ expect(result.publicState).toBeDefined();
38
+ expect(result.privateState).toBeDefined();
39
+ expect(result.message).toBe('Session state initialized');
40
+ });
41
+ it('should initialize with custom bet thresholds', async () => {
42
+ const command = {
43
+ id: 'init-2',
44
+ type: 'INIT_SESSION_STATE',
45
+ payload: {
46
+ betAmountThresholds: [0.5, 1.0, 2.5, 5.0],
47
+ defaultBetAmount: 0.5,
48
+ },
49
+ };
50
+ const result = await engine.processCommand(null, null, command);
51
+ expect(result.success).toBe(true);
52
+ });
53
+ it('should return game engine info', () => {
54
+ const info = engine.getGameEngineInfo();
55
+ expect(info.gameCode).toBe('lucky-sharky');
56
+ expect(info.version).toBeDefined();
57
+ expect(info.rtp).toBeCloseTo(96.17, 1);
58
+ expect(info.gameType).toBe('slot');
59
+ });
60
+ });
61
+ // ============================================================
62
+ // BASE GAME SPINS
63
+ // ============================================================
64
+ describe('Base Game Spins', () => {
65
+ let publicState;
66
+ let privateState;
67
+ beforeEach(async () => {
68
+ const initResult = await engine.processCommand(null, null, {
69
+ id: 'init',
70
+ type: 'INIT_SESSION_STATE',
71
+ payload: {
72
+ betAmountThresholds: [0.2, 0.4, 1.0, 2.0],
73
+ defaultBetAmount: 1.0,
74
+ },
75
+ });
76
+ publicState = initResult.publicState;
77
+ privateState = initResult.privateState;
78
+ });
79
+ it('should execute a base game spin', async () => {
80
+ const command = {
81
+ id: 'spin-1',
82
+ type: 'SPIN',
83
+ payload: {
84
+ sessionId: 'test-session',
85
+ betAmount: 1.0,
86
+ creditsPerLine: 20,
87
+ gameId: 'lucky-sharky',
88
+ gameVersion: '1.0.0',
89
+ },
90
+ };
91
+ const result = await engine.processCommand(publicState, privateState, command);
92
+ expect(result.success).toBe(true);
93
+ expect(result.publicState).toBeDefined();
94
+ expect(result.privateState).toBeDefined();
95
+ expect(result.outcome).toBeDefined();
96
+ });
97
+ it('should handle multiple consecutive spins', async () => {
98
+ let currentPublic = publicState;
99
+ let currentPrivate = privateState;
100
+ for (let i = 0; i < 5; i++) {
101
+ const result = await engine.processCommand(currentPublic, currentPrivate, {
102
+ id: `spin-${i}`,
103
+ type: 'SPIN',
104
+ payload: {
105
+ sessionId: 'test-session',
106
+ betAmount: 1.0,
107
+ creditsPerLine: 20,
108
+ gameId: 'lucky-sharky',
109
+ gameVersion: '1.0.0',
110
+ },
111
+ });
112
+ expect(result.success).toBe(true);
113
+ currentPublic = result.publicState;
114
+ currentPrivate = result.privateState;
115
+ }
116
+ });
117
+ it('should throw error when spinning without initialized state', async () => {
118
+ // Engine throws TypeError when state is null
119
+ // This is expected behavior - state must be initialized
120
+ await expect(engine.processCommand(null, null, {
121
+ id: 'spin-fail',
122
+ type: 'SPIN',
123
+ payload: {
124
+ sessionId: 'test',
125
+ betAmount: 1.0,
126
+ creditsPerLine: 20,
127
+ gameId: 'lucky-sharky',
128
+ gameVersion: '1.0.0',
129
+ },
130
+ })).rejects.toThrow();
131
+ });
132
+ });
133
+ // ============================================================
134
+ // DEBUG TRIGGER BONUS - FREE_SPINS
135
+ // ============================================================
136
+ describe('DEBUG_TRIGGER_BONUS - FREE_SPINS', () => {
137
+ let publicState;
138
+ let privateState;
139
+ beforeEach(async () => {
140
+ const initResult = await engine.processCommand(null, null, {
141
+ id: 'init',
142
+ type: 'INIT_SESSION_STATE',
143
+ payload: {
144
+ betAmountThresholds: [0.2, 1.0, 2.0],
145
+ defaultBetAmount: 1.0,
146
+ },
147
+ });
148
+ publicState = initResult.publicState;
149
+ privateState = initResult.privateState;
150
+ });
151
+ it('should trigger FREE_SPINS via debug command', async () => {
152
+ const command = {
153
+ id: 'debug-fs-1',
154
+ type: 'DEBUG_TRIGGER_BONUS',
155
+ payload: {
156
+ sessionId: 'test-session',
157
+ bonusType: 'FREE_SPINS',
158
+ betAmount: 1.0,
159
+ },
160
+ };
161
+ const result = await engine.processCommand(publicState, privateState, command);
162
+ expect(result.success).toBe(true);
163
+ expect(result.message).toBe('Bonus triggered via debug command');
164
+ expect(result.outcome).toBeDefined();
165
+ expect(result.outcome.triggeredBonus.bonusType).toBe('FREE_SPINS');
166
+ });
167
+ it('should set correct pending state for FREE_SPINS', async () => {
168
+ const result = await engine.processCommand(publicState, privateState, {
169
+ id: 'debug-fs-2',
170
+ type: 'DEBUG_TRIGGER_BONUS',
171
+ payload: {
172
+ sessionId: 'test',
173
+ bonusType: 'FREE_SPINS',
174
+ betAmount: 2.0,
175
+ },
176
+ });
177
+ expect(result.success).toBe(true);
178
+ expect(result.privateState.pendingBonuses.length).toBeGreaterThan(0);
179
+ });
180
+ });
181
+ // ============================================================
182
+ // DEBUG TRIGGER BONUS - HOLD_WIN_BONUS
183
+ // ============================================================
184
+ describe('DEBUG_TRIGGER_BONUS - HOLD_WIN_BONUS', () => {
185
+ let publicState;
186
+ let privateState;
187
+ beforeEach(async () => {
188
+ const initResult = await engine.processCommand(null, null, {
189
+ id: 'init',
190
+ type: 'INIT_SESSION_STATE',
191
+ payload: {
192
+ betAmountThresholds: [0.2, 1.0, 2.0],
193
+ defaultBetAmount: 1.0,
194
+ },
195
+ });
196
+ publicState = initResult.publicState;
197
+ privateState = initResult.privateState;
198
+ });
199
+ it('should trigger HOLD_WIN_BONUS via debug command', async () => {
200
+ const command = {
201
+ id: 'debug-hw-1',
202
+ type: 'DEBUG_TRIGGER_BONUS',
203
+ payload: {
204
+ sessionId: 'test-session',
205
+ bonusType: 'HOLD_WIN_BONUS',
206
+ betAmount: 1.0,
207
+ },
208
+ };
209
+ const result = await engine.processCommand(publicState, privateState, command);
210
+ expect(result.success).toBe(true);
211
+ expect(result.message).toBe('Bonus triggered via debug command');
212
+ expect(result.outcome.triggeredBonus.bonusType).toBe('HOLD_WIN_BONUS');
213
+ });
214
+ it('should set correct pending state for HOLD_WIN_BONUS', async () => {
215
+ const result = await engine.processCommand(publicState, privateState, {
216
+ id: 'debug-hw-2',
217
+ type: 'DEBUG_TRIGGER_BONUS',
218
+ payload: {
219
+ sessionId: 'test',
220
+ bonusType: 'HOLD_WIN_BONUS',
221
+ betAmount: 5.0,
222
+ },
223
+ });
224
+ expect(result.success).toBe(true);
225
+ expect(result.privateState.pendingBonuses.length).toBeGreaterThan(0);
226
+ });
227
+ });
228
+ // ============================================================
229
+ // DEBUG TRIGGER - ERROR CASES
230
+ // ============================================================
231
+ describe('DEBUG_TRIGGER_BONUS - Error Cases', () => {
232
+ let publicState;
233
+ let privateState;
234
+ beforeEach(async () => {
235
+ const initResult = await engine.processCommand(null, null, {
236
+ id: 'init',
237
+ type: 'INIT_SESSION_STATE',
238
+ payload: {
239
+ betAmountThresholds: [1.0],
240
+ defaultBetAmount: 1.0,
241
+ },
242
+ });
243
+ publicState = initResult.publicState;
244
+ privateState = initResult.privateState;
245
+ });
246
+ it('should throw error with unknown bonus type', async () => {
247
+ // Engine throws for unknown bonus types
248
+ await expect(engine.processCommand(publicState, privateState, {
249
+ id: 'debug-fail',
250
+ type: 'DEBUG_TRIGGER_BONUS',
251
+ payload: {
252
+ sessionId: 'test',
253
+ bonusType: 'INVALID_BONUS',
254
+ betAmount: 1.0,
255
+ },
256
+ })).rejects.toThrow('Unknown bonus type');
257
+ });
258
+ it('should throw error without initialized state', async () => {
259
+ // Engine throws TypeError when state is null
260
+ await expect(engine.processCommand(null, null, {
261
+ id: 'debug-null',
262
+ type: 'DEBUG_TRIGGER_BONUS',
263
+ payload: {
264
+ sessionId: 'test',
265
+ bonusType: 'FREE_SPINS',
266
+ betAmount: 1.0,
267
+ },
268
+ })).rejects.toThrow();
269
+ });
270
+ });
271
+ // ============================================================
272
+ // BONUS GAME FLOW - FREE SPINS
273
+ // ============================================================
274
+ describe('Free Spins Bonus Flow', () => {
275
+ let publicState;
276
+ let privateState;
277
+ beforeEach(async () => {
278
+ const initResult = await engine.processCommand(null, null, {
279
+ id: 'init',
280
+ type: 'INIT_SESSION_STATE',
281
+ payload: {
282
+ betAmountThresholds: [1.0],
283
+ defaultBetAmount: 1.0,
284
+ },
285
+ });
286
+ publicState = initResult.publicState;
287
+ privateState = initResult.privateState;
288
+ });
289
+ it('should complete full free spins flow', async () => {
290
+ // 1. Trigger bonus via debug
291
+ const triggerResult = await engine.processCommand(publicState, privateState, {
292
+ id: 'trigger',
293
+ type: 'DEBUG_TRIGGER_BONUS',
294
+ payload: {
295
+ sessionId: 'test',
296
+ bonusType: 'FREE_SPINS',
297
+ betAmount: 1.0,
298
+ },
299
+ });
300
+ expect(triggerResult.success).toBe(true);
301
+ expect(triggerResult.privateState.pendingBonuses.length).toBeGreaterThan(0);
302
+ });
303
+ });
304
+ // ============================================================
305
+ // BONUS GAME FLOW - HOLD & WIN
306
+ // ============================================================
307
+ describe('Hold & Win Bonus Flow', () => {
308
+ let publicState;
309
+ let privateState;
310
+ beforeEach(async () => {
311
+ const initResult = await engine.processCommand(null, null, {
312
+ id: 'init',
313
+ type: 'INIT_SESSION_STATE',
314
+ payload: {
315
+ betAmountThresholds: [1.0],
316
+ defaultBetAmount: 1.0,
317
+ },
318
+ });
319
+ publicState = initResult.publicState;
320
+ privateState = initResult.privateState;
321
+ });
322
+ it('should trigger Hold & Win bonus', async () => {
323
+ const triggerResult = await engine.processCommand(publicState, privateState, {
324
+ id: 'trigger-hw',
325
+ type: 'DEBUG_TRIGGER_BONUS',
326
+ payload: {
327
+ sessionId: 'test',
328
+ bonusType: 'HOLD_WIN_BONUS',
329
+ betAmount: 1.0,
330
+ },
331
+ });
332
+ expect(triggerResult.success).toBe(true);
333
+ expect(triggerResult.privateState.pendingBonuses.length).toBeGreaterThan(0);
334
+ });
335
+ });
336
+ // ============================================================
337
+ // REALITY CHECK
338
+ // ============================================================
339
+ describe('Reality Check', () => {
340
+ let publicState;
341
+ let privateState;
342
+ beforeEach(async () => {
343
+ const initResult = await engine.processCommand(null, null, {
344
+ id: 'init',
345
+ type: 'INIT_SESSION_STATE',
346
+ payload: {
347
+ betAmountThresholds: [1.0],
348
+ defaultBetAmount: 1.0,
349
+ },
350
+ });
351
+ publicState = initResult.publicState;
352
+ privateState = initResult.privateState;
353
+ });
354
+ it('should handle reality check command', async () => {
355
+ const command = {
356
+ id: 'reality-check',
357
+ type: 'ACKNOWLEDGE_REALITY_CHECK',
358
+ payload: {
359
+ sessionId: 'test-session',
360
+ acknowledged: true,
361
+ },
362
+ };
363
+ const result = await engine.processCommand(publicState, privateState, command);
364
+ expect(result).toBeDefined();
365
+ });
366
+ });
367
+ // ============================================================
368
+ // SESSION MANAGEMENT
369
+ // ============================================================
370
+ describe('Session Management', () => {
371
+ let publicState;
372
+ let privateState;
373
+ beforeEach(async () => {
374
+ const initResult = await engine.processCommand(null, null, {
375
+ id: 'init',
376
+ type: 'INIT_SESSION_STATE',
377
+ payload: {
378
+ betAmountThresholds: [1.0],
379
+ defaultBetAmount: 1.0,
380
+ },
381
+ });
382
+ publicState = initResult.publicState;
383
+ privateState = initResult.privateState;
384
+ });
385
+ it('should handle get symbols command', async () => {
386
+ const result = await engine.processCommand(publicState, privateState, {
387
+ id: 'symbols',
388
+ type: 'GET_SYMBOLS',
389
+ payload: {},
390
+ });
391
+ expect(result).toBeDefined();
392
+ expect(result.success).toBe(true);
393
+ });
394
+ });
395
+ // ============================================================
396
+ // ERROR HANDLING
397
+ // ============================================================
398
+ describe('Error Handling', () => {
399
+ it('should handle unknown command type', async () => {
400
+ const initResult = await engine.processCommand(null, null, {
401
+ id: 'init',
402
+ type: 'INIT_SESSION_STATE',
403
+ payload: {
404
+ betAmountThresholds: [1.0],
405
+ defaultBetAmount: 1.0,
406
+ },
407
+ });
408
+ const result = await engine.processCommand(initResult.publicState, initResult.privateState, {
409
+ id: 'unknown',
410
+ type: 'UNKNOWN_COMMAND',
411
+ payload: {},
412
+ });
413
+ expect(result.success).toBe(false);
414
+ expect(result.message).toContain('Command not found');
415
+ });
416
+ });
417
+ // ============================================================
418
+ // STATE PERSISTENCE (Serialization/Deserialization)
419
+ // ============================================================
420
+ describe('State Persistence', () => {
421
+ let publicState;
422
+ let privateState;
423
+ beforeEach(async () => {
424
+ const initResult = await engine.processCommand(null, null, {
425
+ id: 'init',
426
+ type: 'INIT_SESSION_STATE',
427
+ payload: {
428
+ betAmountThresholds: [1.0],
429
+ defaultBetAmount: 1.0,
430
+ },
431
+ });
432
+ publicState = initResult.publicState;
433
+ privateState = initResult.privateState;
434
+ });
435
+ it('should serialize and deserialize state correctly', async () => {
436
+ // Spin first to have meaningful state
437
+ const spin = await engine.processCommand(publicState, privateState, {
438
+ id: 'spin',
439
+ type: 'SPIN',
440
+ payload: {
441
+ sessionId: 'test',
442
+ betAmount: 1.0,
443
+ creditsPerLine: 20,
444
+ gameId: 'lucky-sharky',
445
+ gameVersion: '1.0.0',
446
+ },
447
+ });
448
+ // Serialize state
449
+ const serializedPublic = JSON.stringify(spin.publicState);
450
+ const serializedPrivate = JSON.stringify(spin.privateState);
451
+ // Deserialize
452
+ const restoredPublic = JSON.parse(serializedPublic);
453
+ const restoredPrivate = JSON.parse(serializedPrivate);
454
+ // Continue with restored state
455
+ const result = await engine.processCommand(restoredPublic, restoredPrivate, {
456
+ id: 'spin-2',
457
+ type: 'SPIN',
458
+ payload: {
459
+ sessionId: 'test',
460
+ betAmount: 1.0,
461
+ creditsPerLine: 20,
462
+ gameId: 'lucky-sharky',
463
+ gameVersion: '1.0.0',
464
+ },
465
+ });
466
+ expect(result.success).toBe(true);
467
+ });
468
+ it('should preserve bonus state across serialization', async () => {
469
+ // Trigger bonus
470
+ const bonus = await engine.processCommand(publicState, privateState, {
471
+ id: 'trigger',
472
+ type: 'DEBUG_TRIGGER_BONUS',
473
+ payload: {
474
+ sessionId: 'test',
475
+ bonusType: 'FREE_SPINS',
476
+ betAmount: 1.0,
477
+ },
478
+ });
479
+ expect(bonus.privateState.pendingBonuses.length).toBeGreaterThan(0);
480
+ // Serialize and restore
481
+ const restored = JSON.parse(JSON.stringify(bonus.privateState));
482
+ expect(restored.pendingBonuses.length).toBeGreaterThan(0);
483
+ });
484
+ it('should maintain state across multiple operations', async () => {
485
+ let currentPublic = publicState;
486
+ let currentPrivate = privateState;
487
+ // Perform multiple operations
488
+ for (let i = 0; i < 3; i++) {
489
+ const result = await engine.processCommand(currentPublic, currentPrivate, {
490
+ id: `spin-${i}`,
491
+ type: 'SPIN',
492
+ payload: {
493
+ sessionId: 'test',
494
+ betAmount: 1.0,
495
+ creditsPerLine: 20,
496
+ gameId: 'lucky-sharky',
497
+ gameVersion: '1.0.0',
498
+ },
499
+ });
500
+ expect(result.success).toBe(true);
501
+ currentPublic = result.publicState;
502
+ currentPrivate = result.privateState;
503
+ }
504
+ // Verify state is maintained
505
+ expect(currentPublic).toBeDefined();
506
+ expect(currentPrivate).toBeDefined();
507
+ });
508
+ });
509
+ });
510
+ //# sourceMappingURL=comprehensive.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comprehensive.test.js","sourceRoot":"","sources":["../../src/__tests__/comprehensive.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * DEBUG_TRIGGER_BONUS Command Tests (GLI-19 compliant terminology)
3
+ *
4
+ * Tests for the dev-tools debug command that triggers bonus rounds for testing.
5
+ * Tests the LuckySharkyGameLogic.debugTriggerBonus method directly.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=debug-trigger-bonus.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug-trigger-bonus.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/debug-trigger-bonus.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}