@react-text-game/core 0.2.2 → 0.4.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 (76) hide show
  1. package/README.md +100 -1
  2. package/dist/game.d.ts.map +1 -1
  3. package/dist/game.js +15 -0
  4. package/dist/game.js.map +1 -1
  5. package/dist/i18n/constants.d.ts +21 -0
  6. package/dist/i18n/constants.d.ts.map +1 -0
  7. package/dist/i18n/constants.js +21 -0
  8. package/dist/i18n/constants.js.map +1 -0
  9. package/dist/i18n/hooks/index.d.ts +13 -0
  10. package/dist/i18n/hooks/index.d.ts.map +1 -0
  11. package/dist/i18n/hooks/index.js +13 -0
  12. package/dist/i18n/hooks/index.js.map +1 -0
  13. package/dist/i18n/hooks/useGameTranslation.d.ts +81 -0
  14. package/dist/i18n/hooks/useGameTranslation.d.ts.map +1 -0
  15. package/dist/i18n/hooks/useGameTranslation.js +102 -0
  16. package/dist/i18n/hooks/useGameTranslation.js.map +1 -0
  17. package/dist/i18n/index.d.ts +69 -0
  18. package/dist/i18n/index.d.ts.map +1 -0
  19. package/dist/i18n/index.js +69 -0
  20. package/dist/i18n/index.js.map +1 -0
  21. package/dist/i18n/init.d.ts +62 -0
  22. package/dist/i18n/init.d.ts.map +1 -0
  23. package/dist/i18n/init.js +114 -0
  24. package/dist/i18n/init.js.map +1 -0
  25. package/dist/i18n/types.d.ts +54 -0
  26. package/dist/i18n/types.d.ts.map +1 -0
  27. package/dist/i18n/types.js +2 -0
  28. package/dist/i18n/types.js.map +1 -0
  29. package/dist/i18n/utils.d.ts +55 -0
  30. package/dist/i18n/utils.d.ts.map +1 -0
  31. package/dist/i18n/utils.js +69 -0
  32. package/dist/i18n/utils.js.map +1 -0
  33. package/dist/index.d.ts +2 -2
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/options.d.ts +2 -0
  36. package/dist/options.d.ts.map +1 -1
  37. package/dist/options.js +2 -0
  38. package/dist/options.js.map +1 -1
  39. package/dist/saves/hooks/useLoadGame.d.ts +3 -0
  40. package/dist/saves/hooks/useLoadGame.d.ts.map +1 -1
  41. package/dist/saves/hooks/useLoadGame.js +23 -1
  42. package/dist/saves/hooks/useLoadGame.js.map +1 -1
  43. package/dist/saves/index.d.ts +1 -0
  44. package/dist/saves/index.d.ts.map +1 -1
  45. package/dist/saves/index.js +1 -0
  46. package/dist/saves/index.js.map +1 -1
  47. package/dist/saves/migrations/EXAMPLE.d.ts +113 -0
  48. package/dist/saves/migrations/EXAMPLE.d.ts.map +1 -0
  49. package/dist/saves/migrations/EXAMPLE.js +304 -0
  50. package/dist/saves/migrations/EXAMPLE.js.map +1 -0
  51. package/dist/saves/migrations/index.d.ts +41 -0
  52. package/dist/saves/migrations/index.d.ts.map +1 -0
  53. package/dist/saves/migrations/index.js +40 -0
  54. package/dist/saves/migrations/index.js.map +1 -0
  55. package/dist/saves/migrations/registry.d.ts +72 -0
  56. package/dist/saves/migrations/registry.d.ts.map +1 -0
  57. package/dist/saves/migrations/registry.js +174 -0
  58. package/dist/saves/migrations/registry.js.map +1 -0
  59. package/dist/saves/migrations/runner.d.ts +45 -0
  60. package/dist/saves/migrations/runner.d.ts.map +1 -0
  61. package/dist/saves/migrations/runner.js +139 -0
  62. package/dist/saves/migrations/runner.js.map +1 -0
  63. package/dist/saves/migrations/types.d.ts +182 -0
  64. package/dist/saves/migrations/types.d.ts.map +1 -0
  65. package/dist/saves/migrations/types.js +2 -0
  66. package/dist/saves/migrations/types.js.map +1 -0
  67. package/dist/tests/game.test.js.map +1 -1
  68. package/dist/tests/i18n.test.d.ts +2 -0
  69. package/dist/tests/i18n.test.d.ts.map +1 -0
  70. package/dist/tests/i18n.test.js +590 -0
  71. package/dist/tests/i18n.test.js.map +1 -0
  72. package/dist/tests/migrations.test.d.ts +2 -0
  73. package/dist/tests/migrations.test.d.ts.map +1 -0
  74. package/dist/tests/migrations.test.js +602 -0
  75. package/dist/tests/migrations.test.js.map +1 -0
  76. package/package.json +17 -7
@@ -0,0 +1,602 @@
1
+ import { beforeEach, describe, expect, test } from "bun:test";
2
+ import { clearMigrations, findMigrationPath, getAllMigrations, registerMigration, runMigrations, validateMigrations, } from "../saves/migrations";
3
+ describe("Migration System", () => {
4
+ beforeEach(() => {
5
+ // Clear all registered migrations before each test
6
+ clearMigrations();
7
+ });
8
+ describe("registerMigration", () => {
9
+ test("registers a migration successfully", () => {
10
+ const migration = {
11
+ from: "1.0.0",
12
+ to: "1.1.0",
13
+ description: "Test migration",
14
+ migrate: (data) => data,
15
+ };
16
+ registerMigration(migration);
17
+ const migrations = getAllMigrations();
18
+ expect(migrations).toHaveLength(1);
19
+ expect(migrations[0]).toBe(migration);
20
+ });
21
+ test("throws error when registering duplicate migration", () => {
22
+ const migration = {
23
+ from: "1.0.0",
24
+ to: "1.1.0",
25
+ description: "Test migration",
26
+ migrate: (data) => data,
27
+ };
28
+ registerMigration(migration);
29
+ expect(() => registerMigration(migration)).toThrow("Migration from 1.0.0 to 1.1.0 is already registered");
30
+ });
31
+ test("allows multiple migrations with different paths", () => {
32
+ registerMigration({
33
+ from: "1.0.0",
34
+ to: "1.1.0",
35
+ description: "First",
36
+ migrate: (data) => data,
37
+ });
38
+ registerMigration({
39
+ from: "1.1.0",
40
+ to: "1.2.0",
41
+ description: "Second",
42
+ migrate: (data) => data,
43
+ });
44
+ expect(getAllMigrations()).toHaveLength(2);
45
+ });
46
+ });
47
+ describe("findMigrationPath", () => {
48
+ test("returns empty array for same version", () => {
49
+ const path = findMigrationPath("1.0.0", "1.0.0");
50
+ expect(path).toEqual([]);
51
+ });
52
+ test("finds single migration path", () => {
53
+ const migration = {
54
+ from: "1.0.0",
55
+ to: "1.1.0",
56
+ description: "Test",
57
+ migrate: (data) => data,
58
+ };
59
+ registerMigration(migration);
60
+ const path = findMigrationPath("1.0.0", "1.1.0");
61
+ expect(path).toHaveLength(1);
62
+ expect(path[0]).toBe(migration);
63
+ });
64
+ test("finds multi-step migration path", () => {
65
+ const m1 = {
66
+ from: "1.0.0",
67
+ to: "1.1.0",
68
+ description: "Step 1",
69
+ migrate: (data) => data,
70
+ };
71
+ const m2 = {
72
+ from: "1.1.0",
73
+ to: "1.2.0",
74
+ description: "Step 2",
75
+ migrate: (data) => data,
76
+ };
77
+ const m3 = {
78
+ from: "1.2.0",
79
+ to: "2.0.0",
80
+ description: "Step 3",
81
+ migrate: (data) => data,
82
+ };
83
+ registerMigration(m1);
84
+ registerMigration(m2);
85
+ registerMigration(m3);
86
+ const path = findMigrationPath("1.0.0", "2.0.0");
87
+ expect(path).toHaveLength(3);
88
+ expect(path[0]).toBe(m1);
89
+ expect(path[1]).toBe(m2);
90
+ expect(path[2]).toBe(m3);
91
+ });
92
+ test("returns null when no path exists", () => {
93
+ registerMigration({
94
+ from: "1.0.0",
95
+ to: "1.1.0",
96
+ description: "Test",
97
+ migrate: (data) => data,
98
+ });
99
+ const path = findMigrationPath("1.0.0", "2.0.0");
100
+ expect(path).toBeNull();
101
+ });
102
+ test("finds shortest path when multiple paths exist", () => {
103
+ // Create two paths: direct and indirect
104
+ const direct = {
105
+ from: "1.0.0",
106
+ to: "2.0.0",
107
+ description: "Direct",
108
+ migrate: (data) => data,
109
+ };
110
+ const indirect1 = {
111
+ from: "1.0.0",
112
+ to: "1.5.0",
113
+ description: "Indirect 1",
114
+ migrate: (data) => data,
115
+ };
116
+ const indirect2 = {
117
+ from: "1.5.0",
118
+ to: "2.0.0",
119
+ description: "Indirect 2",
120
+ migrate: (data) => data,
121
+ };
122
+ registerMigration(direct);
123
+ registerMigration(indirect1);
124
+ registerMigration(indirect2);
125
+ const path = findMigrationPath("1.0.0", "2.0.0");
126
+ // Should find the shortest path (direct)
127
+ expect(path).toHaveLength(1);
128
+ expect(path[0]).toBe(direct);
129
+ });
130
+ });
131
+ describe("runMigrations", () => {
132
+ test("returns original data when versions match", () => {
133
+ const data = { player: { health: 100 } };
134
+ const result = runMigrations(data, "1.0.0", "1.0.0");
135
+ expect(result.success).toBe(true);
136
+ expect(result.data).toBe(data);
137
+ expect(result.migrationsApplied).toHaveLength(0);
138
+ });
139
+ test("applies single migration successfully", () => {
140
+ registerMigration({
141
+ from: "1.0.0",
142
+ to: "1.1.0",
143
+ description: "Add inventory",
144
+ migrate: (data) => ({
145
+ ...data,
146
+ inventory: [],
147
+ }),
148
+ });
149
+ const data = { player: { health: 100 } };
150
+ const result = runMigrations(data, "1.0.0", "1.1.0");
151
+ expect(result.success).toBe(true);
152
+ expect(result.data).toEqual({
153
+ player: { health: 100 },
154
+ inventory: [],
155
+ });
156
+ expect(result.migrationsApplied).toHaveLength(1);
157
+ expect(result.migrationsApplied[0]?.from).toBe("1.0.0");
158
+ expect(result.migrationsApplied[0]?.to).toBe("1.1.0");
159
+ });
160
+ test("applies multiple migrations in sequence", () => {
161
+ registerMigration({
162
+ from: "1.0.0",
163
+ to: "1.1.0",
164
+ description: "Add inventory",
165
+ migrate: (data) => ({
166
+ ...data,
167
+ inventory: [],
168
+ }),
169
+ });
170
+ registerMigration({
171
+ from: "1.1.0",
172
+ to: "1.2.0",
173
+ description: "Add quests",
174
+ migrate: (data) => ({
175
+ ...data,
176
+ quests: [],
177
+ }),
178
+ });
179
+ const data = { player: { health: 100 } };
180
+ const result = runMigrations(data, "1.0.0", "1.2.0");
181
+ expect(result.success).toBe(true);
182
+ expect(result.data).toEqual({
183
+ player: { health: 100 },
184
+ inventory: [],
185
+ quests: [],
186
+ });
187
+ expect(result.migrationsApplied).toHaveLength(2);
188
+ });
189
+ test("handles migration that renames fields", () => {
190
+ registerMigration({
191
+ from: "1.0.0",
192
+ to: "2.0.0",
193
+ description: "Rename hp to health",
194
+ migrate: (data) => {
195
+ const player = data.player;
196
+ const { hp, ...playerRest } = player;
197
+ return {
198
+ ...data,
199
+ player: {
200
+ ...playerRest,
201
+ health: hp,
202
+ },
203
+ };
204
+ },
205
+ });
206
+ const data = { player: { hp: 80, name: "Hero" } };
207
+ const result = runMigrations(data, "1.0.0", "2.0.0");
208
+ expect(result.success).toBe(true);
209
+ expect(result.data).toEqual({
210
+ player: { health: 80, name: "Hero" },
211
+ });
212
+ });
213
+ test("handles migration that restructures data", () => {
214
+ registerMigration({
215
+ from: "1.0.0",
216
+ to: "2.0.0",
217
+ description: "Move stats to separate object",
218
+ migrate: (data) => {
219
+ const player = data.player;
220
+ return {
221
+ ...data,
222
+ player: {
223
+ name: player.name,
224
+ stats: {
225
+ health: player.health,
226
+ mana: player.mana,
227
+ },
228
+ },
229
+ };
230
+ },
231
+ });
232
+ const data = {
233
+ player: { name: "Hero", health: 100, mana: 50 },
234
+ };
235
+ const result = runMigrations(data, "1.0.0", "2.0.0");
236
+ expect(result.success).toBe(true);
237
+ expect(result.data).toEqual({
238
+ player: {
239
+ name: "Hero",
240
+ stats: { health: 100, mana: 50 },
241
+ },
242
+ });
243
+ });
244
+ test("returns error when no migration path exists (non-strict)", () => {
245
+ const data = { player: { health: 100 } };
246
+ const result = runMigrations(data, "1.0.0", "2.0.0", {
247
+ strict: false,
248
+ });
249
+ expect(result.success).toBe(false);
250
+ expect(result.error).toContain("No migration path found");
251
+ expect(result.migrationsApplied).toHaveLength(0);
252
+ });
253
+ test("throws error when no migration path exists (strict mode)", () => {
254
+ const data = { player: { health: 100 } };
255
+ expect(() => {
256
+ runMigrations(data, "1.0.0", "2.0.0", { strict: true });
257
+ }).toThrow("No migration path found");
258
+ });
259
+ test("returns error when migration function throws", () => {
260
+ registerMigration({
261
+ from: "1.0.0",
262
+ to: "1.1.0",
263
+ description: "Failing migration",
264
+ migrate: () => {
265
+ throw new Error("Migration failed");
266
+ },
267
+ });
268
+ const data = { player: { health: 100 } };
269
+ const result = runMigrations(data, "1.0.0", "1.1.0");
270
+ expect(result.success).toBe(false);
271
+ expect(result.error).toContain("Migration failed");
272
+ });
273
+ test("returns error when migration returns invalid data", () => {
274
+ registerMigration({
275
+ from: "1.0.0",
276
+ to: "1.1.0",
277
+ description: "Invalid migration",
278
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
279
+ migrate: () => null,
280
+ });
281
+ const data = { player: { health: 100 } };
282
+ const result = runMigrations(data, "1.0.0", "1.1.0");
283
+ expect(result.success).toBe(false);
284
+ expect(result.error).toContain("returned invalid data type");
285
+ });
286
+ test("complex migration chain scenario", () => {
287
+ // Simulate a realistic migration chain
288
+ registerMigration({
289
+ from: "1.0.0",
290
+ to: "1.1.0",
291
+ description: "Add inventory",
292
+ migrate: (data) => {
293
+ const player = data.player;
294
+ return {
295
+ ...data,
296
+ player: {
297
+ ...player,
298
+ inventory: [],
299
+ },
300
+ };
301
+ },
302
+ });
303
+ registerMigration({
304
+ from: "1.1.0",
305
+ to: "1.2.0",
306
+ description: "Rename hp to health",
307
+ migrate: (data) => {
308
+ const player = data.player;
309
+ const { hp, ...rest } = player;
310
+ return {
311
+ ...data,
312
+ player: {
313
+ ...rest,
314
+ health: hp ?? 100,
315
+ },
316
+ };
317
+ },
318
+ });
319
+ registerMigration({
320
+ from: "1.2.0",
321
+ to: "2.0.0",
322
+ description: "Add skills",
323
+ migrate: (data) => {
324
+ const player = data.player;
325
+ return {
326
+ ...data,
327
+ player: {
328
+ ...player,
329
+ skills: { combat: 1, magic: 1 },
330
+ },
331
+ };
332
+ },
333
+ });
334
+ const oldData = {
335
+ player: { name: "Hero", hp: 75 },
336
+ };
337
+ const result = runMigrations(oldData, "1.0.0", "2.0.0");
338
+ expect(result.success).toBe(true);
339
+ expect(result.data).toEqual({
340
+ player: {
341
+ name: "Hero",
342
+ health: 75,
343
+ inventory: [],
344
+ skills: { combat: 1, magic: 1 },
345
+ },
346
+ });
347
+ expect(result.migrationsApplied).toHaveLength(3);
348
+ });
349
+ });
350
+ describe("validateMigrations", () => {
351
+ test("returns valid for empty migrations", () => {
352
+ const result = validateMigrations("1.0.0");
353
+ expect(result.valid).toBe(true);
354
+ expect(result.issues).toHaveLength(0);
355
+ });
356
+ test("returns valid for complete migration chain", () => {
357
+ registerMigration({
358
+ from: "1.0.0",
359
+ to: "1.1.0",
360
+ description: "Step 1",
361
+ migrate: (data) => data,
362
+ });
363
+ registerMigration({
364
+ from: "1.1.0",
365
+ to: "1.2.0",
366
+ description: "Step 2",
367
+ migrate: (data) => data,
368
+ });
369
+ registerMigration({
370
+ from: "1.2.0",
371
+ to: "2.0.0",
372
+ description: "Step 3",
373
+ migrate: (data) => data,
374
+ });
375
+ const result = validateMigrations("2.0.0");
376
+ expect(result.valid).toBe(true);
377
+ expect(result.issues).toHaveLength(0);
378
+ });
379
+ test("detects missing path to latest version", () => {
380
+ registerMigration({
381
+ from: "1.0.0",
382
+ to: "1.1.0",
383
+ description: "Step 1",
384
+ migrate: (data) => data,
385
+ });
386
+ // Missing: 1.1.0 -> 2.0.0
387
+ const result = validateMigrations("2.0.0");
388
+ expect(result.valid).toBe(false);
389
+ expect(result.issues.length).toBeGreaterThan(0);
390
+ expect(result.issues[0]).toContain("No migration path from base version 1.0.0 to latest version 2.0.0");
391
+ });
392
+ test("detects dead ends", () => {
393
+ registerMigration({
394
+ from: "1.0.0",
395
+ to: "1.1.0",
396
+ description: "Step 1",
397
+ migrate: (data) => data,
398
+ });
399
+ registerMigration({
400
+ from: "1.0.0",
401
+ to: "1.5.0",
402
+ description: "Branch",
403
+ migrate: (data) => data,
404
+ });
405
+ // 1.5.0 is a dead end - no path from it to anywhere
406
+ const result = validateMigrations("1.1.0");
407
+ expect(result.valid).toBe(false);
408
+ expect(result.issues.some((issue) => issue.includes("Dead end"))).toBe(true);
409
+ });
410
+ test("accepts multiple base versions if all reach latest", () => {
411
+ // Two separate starting points
412
+ registerMigration({
413
+ from: "1.0.0",
414
+ to: "2.0.0",
415
+ description: "Path 1",
416
+ migrate: (data) => data,
417
+ });
418
+ registerMigration({
419
+ from: "1.5.0",
420
+ to: "2.0.0",
421
+ description: "Path 2",
422
+ migrate: (data) => data,
423
+ });
424
+ const result = validateMigrations("2.0.0");
425
+ expect(result.valid).toBe(true);
426
+ });
427
+ });
428
+ describe("clearMigrations", () => {
429
+ test("clears all registered migrations", () => {
430
+ registerMigration({
431
+ from: "1.0.0",
432
+ to: "1.1.0",
433
+ description: "Test",
434
+ migrate: (data) => data,
435
+ });
436
+ expect(getAllMigrations()).toHaveLength(1);
437
+ clearMigrations();
438
+ expect(getAllMigrations()).toHaveLength(0);
439
+ });
440
+ });
441
+ describe("Real-world migration scenarios", () => {
442
+ test("handles adding optional fields with defaults", () => {
443
+ registerMigration({
444
+ from: "1.0.0",
445
+ to: "1.1.0",
446
+ description: "Add optional settings",
447
+ migrate: (data) => ({
448
+ ...data,
449
+ settings: {
450
+ volume: 1.0,
451
+ difficulty: "normal",
452
+ },
453
+ }),
454
+ });
455
+ const oldSave = {
456
+ player: { name: "Hero" },
457
+ };
458
+ const result = runMigrations(oldSave, "1.0.0", "1.1.0");
459
+ expect(result.success).toBe(true);
460
+ if (result.data) {
461
+ expect(result.data.settings).toEqual({
462
+ volume: 1.0,
463
+ difficulty: "normal",
464
+ });
465
+ }
466
+ });
467
+ test("handles transforming array data", () => {
468
+ registerMigration({
469
+ from: "1.0.0",
470
+ to: "2.0.0",
471
+ description: "Convert inventory to item objects",
472
+ migrate: (data) => {
473
+ const oldInventory = (data.inventory || []);
474
+ const itemCounts = new Map();
475
+ oldInventory.forEach((item) => {
476
+ itemCounts.set(item, (itemCounts.get(item) || 0) + 1);
477
+ });
478
+ const newInventory = Array.from(itemCounts.entries()).map(([name, quantity], index) => ({
479
+ id: `item_${index}`,
480
+ name,
481
+ quantity,
482
+ }));
483
+ return {
484
+ ...data,
485
+ inventory: newInventory,
486
+ };
487
+ },
488
+ });
489
+ const oldSave = {
490
+ inventory: ["sword", "potion", "potion", "shield"],
491
+ };
492
+ const result = runMigrations(oldSave, "1.0.0", "2.0.0");
493
+ expect(result.success).toBe(true);
494
+ if (result.data) {
495
+ expect(result.data.inventory).toHaveLength(3);
496
+ expect(result.data.inventory).toEqual([
497
+ { id: "item_0", name: "sword", quantity: 1 },
498
+ { id: "item_1", name: "potion", quantity: 2 },
499
+ { id: "item_2", name: "shield", quantity: 1 },
500
+ ]);
501
+ }
502
+ });
503
+ test("handles conditional migrations based on data presence", () => {
504
+ registerMigration({
505
+ from: "1.0.0",
506
+ to: "1.1.0",
507
+ description: "Migrate conditional data",
508
+ migrate: (data) => {
509
+ const player = (data.player || {});
510
+ return {
511
+ ...data,
512
+ player: {
513
+ ...player,
514
+ // Use existing value or default
515
+ health: player.hp ?? player.health ?? 100,
516
+ hp: undefined, // Remove old field if it exists
517
+ },
518
+ };
519
+ },
520
+ });
521
+ // Test with hp field
522
+ const save1 = { player: { hp: 75 } };
523
+ const result1 = runMigrations(save1, "1.0.0", "1.1.0");
524
+ expect(result1.success).toBe(true);
525
+ if (result1.data) {
526
+ expect(result1.data.player.health).toBe(75);
527
+ }
528
+ // Test with health field already
529
+ const save2 = { player: { health: 80 } };
530
+ const result2 = runMigrations(save2, "1.0.0", "1.1.0");
531
+ expect(result2.success).toBe(true);
532
+ if (result2.data) {
533
+ expect(result2.data.player.health).toBe(80);
534
+ }
535
+ // Test with neither field
536
+ const save3 = { player: { name: "Hero" } };
537
+ const result3 = runMigrations(save3, "1.0.0", "1.1.0");
538
+ expect(result3.success).toBe(true);
539
+ if (result3.data) {
540
+ expect(result3.data.player.health).toBe(100);
541
+ }
542
+ });
543
+ });
544
+ describe("Generic type safety", () => {
545
+ test("works with typed migrations for better type safety", () => {
546
+ const migration = {
547
+ from: "1.0.0",
548
+ to: "1.1.0",
549
+ description: "Add typed inventory",
550
+ migrate: (data) => {
551
+ const player = data.player || {};
552
+ return {
553
+ ...data,
554
+ player: {
555
+ ...player,
556
+ inventory: [], // TypeScript knows this should be string[]
557
+ },
558
+ };
559
+ },
560
+ };
561
+ registerMigration(migration);
562
+ const oldSave = { player: { name: "Hero" } };
563
+ const result = runMigrations(oldSave, "1.0.0", "1.1.0");
564
+ expect(result.success).toBe(true);
565
+ if (result.data) {
566
+ expect(result.data.player?.inventory).toEqual([]);
567
+ }
568
+ });
569
+ test("supports complex nested types for type safety", () => {
570
+ const migration = {
571
+ from: "1.0.0",
572
+ to: "2.0.0",
573
+ description: "Restructure player stats with types",
574
+ migrate: (data) => {
575
+ const player = (data.player || {});
576
+ return {
577
+ ...data,
578
+ player: {
579
+ name: player.name,
580
+ stats: {
581
+ health: player.health ?? 100,
582
+ mana: player.mana ?? 50,
583
+ },
584
+ },
585
+ };
586
+ },
587
+ };
588
+ registerMigration(migration);
589
+ const oldSave = {
590
+ player: { name: "Hero", health: 80, mana: 30 },
591
+ };
592
+ const result = runMigrations(oldSave, "1.0.0", "2.0.0");
593
+ expect(result.success).toBe(true);
594
+ if (result.data) {
595
+ const migratedData = result.data;
596
+ expect(migratedData.player?.stats?.health).toBe(80);
597
+ expect(migratedData.player?.stats?.mana).toBe(30);
598
+ }
599
+ });
600
+ });
601
+ });
602
+ //# sourceMappingURL=migrations.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrations.test.js","sourceRoot":"","sources":["../../src/tests/migrations.test.ts"],"names":[],"mappings":"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"}