@react-text-game/core 0.2.1 → 0.3.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 (37) hide show
  1. package/README.md +2 -0
  2. package/dist/game.d.ts.map +1 -1
  3. package/dist/game.js +13 -0
  4. package/dist/game.js.map +1 -1
  5. package/dist/saves/hooks/useLoadGame.d.ts +3 -0
  6. package/dist/saves/hooks/useLoadGame.d.ts.map +1 -1
  7. package/dist/saves/hooks/useLoadGame.js +23 -1
  8. package/dist/saves/hooks/useLoadGame.js.map +1 -1
  9. package/dist/saves/index.d.ts +1 -0
  10. package/dist/saves/index.d.ts.map +1 -1
  11. package/dist/saves/index.js +1 -0
  12. package/dist/saves/index.js.map +1 -1
  13. package/dist/saves/migrations/EXAMPLE.d.ts +113 -0
  14. package/dist/saves/migrations/EXAMPLE.d.ts.map +1 -0
  15. package/dist/saves/migrations/EXAMPLE.js +304 -0
  16. package/dist/saves/migrations/EXAMPLE.js.map +1 -0
  17. package/dist/saves/migrations/index.d.ts +41 -0
  18. package/dist/saves/migrations/index.d.ts.map +1 -0
  19. package/dist/saves/migrations/index.js +40 -0
  20. package/dist/saves/migrations/index.js.map +1 -0
  21. package/dist/saves/migrations/registry.d.ts +72 -0
  22. package/dist/saves/migrations/registry.d.ts.map +1 -0
  23. package/dist/saves/migrations/registry.js +174 -0
  24. package/dist/saves/migrations/registry.js.map +1 -0
  25. package/dist/saves/migrations/runner.d.ts +45 -0
  26. package/dist/saves/migrations/runner.d.ts.map +1 -0
  27. package/dist/saves/migrations/runner.js +139 -0
  28. package/dist/saves/migrations/runner.js.map +1 -0
  29. package/dist/saves/migrations/types.d.ts +182 -0
  30. package/dist/saves/migrations/types.d.ts.map +1 -0
  31. package/dist/saves/migrations/types.js +2 -0
  32. package/dist/saves/migrations/types.js.map +1 -0
  33. package/dist/tests/migrations.test.d.ts +2 -0
  34. package/dist/tests/migrations.test.d.ts.map +1 -0
  35. package/dist/tests/migrations.test.js +602 -0
  36. package/dist/tests/migrations.test.js.map +1 -0
  37. package/package.json +3 -4
package/README.md CHANGED
@@ -384,6 +384,8 @@ Storage.setState(state);
384
384
 
385
385
  The engine includes a comprehensive save/load system built on IndexedDB (via Dexie) with encryption support for export/import:
386
386
 
387
+ > **💾 Save Migrations**: For managing save compatibility across game versions, see the [Save Migration Guide](./MIGRATIONS.md).
388
+
387
389
  ```typescript
388
390
  import {
389
391
  useSaveSlots,
@@ -1 +1 @@
1
- {"version":3,"file":"game.d.ts","sourceRoot":"","sources":["../src/game.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"game.d.ts","sourceRoot":"","sources":["../src/game.ts"],"names":[],"mappings":"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"}
package/dist/game.js CHANGED
@@ -3,6 +3,7 @@ import { STORAGE_SYSTEM_PATH, SYSTEM_PASSAGE_NAMES } from "./constants";
3
3
  import { logger } from "./logger";
4
4
  import { _getOptions, newOptions } from "./options";
5
5
  import { createOrUpdateSystemSave } from "./saves";
6
+ import { validateMigrations } from "./saves/migrations";
6
7
  import { Storage } from "./storage";
7
8
  const objectRegistry = new Map();
8
9
  const passagesRegistry = new Map();
@@ -432,6 +433,18 @@ export class Game {
432
433
  if (Game.options.isDevMode) {
433
434
  logger.warn("Game is running in dev mode, do not use in production!");
434
435
  }
436
+ // Validate migrations in dev mode
437
+ if (Game.options.isDevMode) {
438
+ const validation = validateMigrations(Game.options.gameVersion);
439
+ if (!validation.valid) {
440
+ logger.warn("Migration validation failed. The following issues were found:");
441
+ validation.issues.forEach((issue) => logger.warn(` - ${issue}`));
442
+ logger.warn("These issues may cause problems when loading saves from older versions.");
443
+ }
444
+ else if (validation.issues.length === 0) {
445
+ logger.log("Migration validation passed");
446
+ }
447
+ }
435
448
  Game.setCurrent(SYSTEM_PASSAGE_NAMES.START_MENU);
436
449
  const initialState = Game.getState(true);
437
450
  await createOrUpdateSystemSave(initialState);
package/dist/game.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"game.js","sourceRoot":"","sources":["../src/game.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"game.js","sourceRoot":"","sources":["../src/game.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAE1C,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEvE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,WAAW,EAAc,UAAU,EAAW,MAAM,UAAU,CAAC;AAExE,OAAO,EAAE,wBAAwB,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAGnC,MAAM,cAAc,GAAG,IAAI,GAAG,EAA0B,CAAC;AACzD,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAmB,CAAC;AAEpD,MAAM,QAAQ,GAAG,GAAG,mBAAmB,OAAmC,CAAC;AAM3E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,MAAM,OAAO,IAAI;IACL,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;QACzB,gBAAgB,EAAE,IAAqB;KAC1C,CAAC,CAAC;IAEK,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC;IAC3B,MAAM,CAAC,eAAe,GAAG,KAAK,CAAC;IAC/B,MAAM,CAAC,SAAS,GAAyC,IAAI,CAAC;IAC9D,MAAM,CAAC,oBAAoB,GAAsB,EAAE,CAAC;IACpD,MAAM,CAAU,aAAa,GAAG,cAAc,CAAC;IAC/C,MAAM,CAAU,gBAAgB,GAAG,GAAG,CAAC;IAE/C;;;;;OAKG;IACK,MAAM,CAAC,iBAAiB;QAC5B,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CACX,6EAA6E,CAChF,CAAC;QACN,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,cAAc,CAAC,GAAG,OAA8B;QACnD,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;YACvB,IAAI,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;gBAChC,MAAM,IAAI,KAAK,CAAC,WAAW,MAAM,CAAC,EAAE,0BAA0B,CAAC,CAAC;YACpE,CAAC;YAED,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;YACpC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;YAE7C,MAAM,CAAC,GAAG,CAAC,sBAAsB,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;;;;;;OAOG;IACH,MAAM,CAAC,eAAe,CAAC,GAAG,QAAwB;QAC9C,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAE3D,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YACzB,IACI,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBAChC,8CAA8C;gBAC9C,CAAC,cAAc,CAAC,QAAQ,CACpB,OAAO,CAAC,EAAqC,CAChD,EACH,CAAC;gBACC,MAAM,IAAI,KAAK,CACX,YAAY,OAAO,CAAC,EAAE,0BAA0B,CACnD,CAAC;YACN,CAAC;YAED,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;YAE1C,MAAM,CAAC,GAAG,CAAC,uBAAuB,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;;;;OAKG;IACH,MAAM,KAAK,kBAAkB;QACzB,OAAO,gBAAgB,CAAC,MAAM,EAAE,CAAC;IACrC,CAAC;IAED;;;;;;OAMG;IACH,MAAM,KAAK,cAAc;QACrB,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAEzB,IAAI,IAAI,CAAC,KAAK,CAAC,gBAAgB,KAAK,IAAI,EAAE,CAAC;YACvC,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,OAAO,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,IAAI,IAAI,CAAC;IACrE,CAAC;IAED;;;;;;OAMG;IACH,MAAM,CAAC,cAAc,CAAC,SAAiB;QACnC,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,OAAO,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC;IACnD,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,cAAc;QACjB,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC,CAAC;IACjD,CAAC;IAED;;;;;;OAMG;IACH,MAAM,CAAC,MAAM,CAAC,OAAyB;QACnC,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAEzB,MAAM,SAAS,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;QAErE,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC;QAEjE,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,YAAY,SAAS,cAAc,CAAC,CAAC;QACzD,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,gBAAgB,GAAG,gBAAgB;YAC1C,CAAC,CAAC,gBAAgB,CAAC,EAAE;YACrB,CAAC,CAAC,IAAI,CAAC;QAEX,MAAM,CAAC,GAAG,CAAC,sBAAsB,SAAS,EAAE,CAAC,CAAC;IAClD,CAAC;IAED;;;;;;OAMG;IACH,MAAM,CAAC,UAAU,CAAC,OAAyB;QACvC,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAEzB,IAAI,CAAC,KAAK,CAAC,gBAAgB;YACvB,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;QAEvD,MAAM,CAAC,GAAG,CAAC,wBAAwB,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC,CAAC;IACtE,CAAC;IAED;;;;;;;OAOG;IACH,MAAM,CAAC,iBAAiB,CAA2B,MAAS;QACxD,OAAQ,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAO,IAAI,MAAM,CAAC;IAC1D,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,qBAAqB;QACxB,OAAO,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED;;;;;OAKG;IACH,MAAM,KAAK,SAAS;QAChB,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC,KAAK,CAAC;IACtB,CAAC;IAED;;;;;;;OAOG;IACK,MAAM,CAAC,IAAI;QACf,MAAM,aAAa,GAAG;YAClB,gBAAgB,EAAE,IAAI,CAAC,KAAK,CAAC,gBAAgB;SACP,CAAC;QAE3C,OAAO,CAAC,QAAQ,CAAC,QAAQ,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC;QAEhD,MAAM,CAAC,GAAG,CAAC,qBAAqB,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IACrE,CAAC;IAED;;;;;OAKG;IACK,MAAM,CAAC,IAAI;QACf,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAwB,QAAQ,CAAC,CAAC;QACrE,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAC7C,CAAC;QACD,MAAM,EAAE,gBAAgB,EAAE,GAAG,UAAU,CAAC,CAAC,CAAE,CAAC;QAC5C,IAAI,CAAC,KAAK,CAAC,gBAAgB,GAAG,gBAAgB,IAAI,IAAI,CAAC;QAEvD,MAAM,CAAC,GAAG,CAAC,sBAAsB,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACtE,CAAC;IAED;;;;;;;;;;;;;;;;OAgBG;IACH,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,KAAK;QAC1B,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC7B,CAAC;QAED,IAAI,CAAC,IAAI,EAAE,CAAC;QACZ,KAAK,MAAM,CAAC,EAAE,MAAM,CAAC,IAAI,cAAc,EAAE,CAAC;YACtC,MAAM,CAAC,IAAI,EAAE,CAAC;QAClB,CAAC;QACD,OAAO,OAAO,CAAC,QAAQ,EAAE,CAAC;IAC9B,CAAC;IAED;;;;;;;;;;;;;;;;OAgBG;IACH,MAAM,CAAC,QAAQ,CAAC,KAAoB;QAChC,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAEzB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,EAAE,CAAC;QACZ,KAAK,MAAM,CAAC,EAAE,MAAM,CAAC,IAAI,cAAc,EAAE,CAAC;YACtC,MAAM,CAAC,IAAI,EAAE,CAAC;QAClB,CAAC;IACL,CAAC;IAED;;;;;;OAMG;IACK,MAAM,CAAC,oBAAoB;QAC/B,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACjB,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACjC,CAAC;QAED,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;YAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC9B,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;QACtE,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC9B,CAAC;IAED;;;;;;;;;;;;;;OAcG;IACH,MAAM,CAAC,cAAc;QACjB,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAEzB,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACvB,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;YAC5C,OAAO;QACX,CAAC;QAED,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAE5B,kCAAkC;QAClC,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE;YACzC,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAChC,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAE1C,uCAAuC;QACvC,KAAK,MAAM,CAAC,EAAE,MAAM,CAAC,IAAI,cAAc,EAAE,CAAC;YACtC,MAAM,WAAW,GAAG,SAAS,CAAC,MAAM,EAAE,GAAG,EAAE;gBACvC,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAChC,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAChD,CAAC;QAED,MAAM,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACpC,CAAC;IAED;;;;;;OAMG;IACH,MAAM,CAAC,eAAe;QAClB,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAEzB,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YACxB,MAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;YAC7C,OAAO;QACX,CAAC;QAED,uBAAuB;QACvB,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACjB,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC7B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QAC1B,CAAC;QAED,4BAA4B;QAC5B,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;QAClE,IAAI,CAAC,oBAAoB,GAAG,EAAE,CAAC;QAE/B,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;QAE7B,MAAM,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IACrC,CAAC;IAED;;;;;;;;;;;;;;OAcG;IACH,MAAM,CAAC,sBAAsB;QACzB,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAEzB,MAAM,UAAU,GAAG,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAE9D,IAAI,CAAC,UAAU,EAAE,CAAC;YACd,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,IAAI,CAAC;YACD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAkB,CAAC;YACtD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACrB,MAAM,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;YACrD,OAAO,IAAI,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,4CAA4C,EAAE,KAAK,CAAC,CAAC;YAClE,OAAO,KAAK,CAAC;QACjB,CAAC;IACL,CAAC;IAED;;;;;;;;;OASG;IACH,MAAM,CAAC,aAAa;QAChB,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC9C,MAAM,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;IAC9D,CAAC;IAED;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAgB;QAC9B,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;YACzB,MAAM,CAAC,IAAI,CACP,wDAAwD,CAC3D,CAAC;QACN,CAAC;QAED,kCAAkC;QAClC,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;YACzB,MAAM,UAAU,GAAG,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;YAChE,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;gBACpB,MAAM,CAAC,IAAI,CACP,+DAA+D,CAClE,CAAC;gBACF,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC;gBAClE,MAAM,CAAC,IAAI,CACP,yEAAyE,CAC5E,CAAC;YACN,CAAC;iBAAM,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACxC,MAAM,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;YAC9C,CAAC;QACL,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC;QAEjD,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,wBAAwB,CAAC,YAAY,CAAC,CAAC;QAE7C,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;YAC1B,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAC9B,IAAI,CAAC,cAAc,EAAE,CAAC;QAC1B,CAAC;aAAM,CAAC;YACJ,MAAM,CAAC,IAAI,CACP,uDAAuD,CAC1D,CAAC;QACN,CAAC;QAED,MAAM,CAAC,GAAG,CAAC,kCAAkC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACzE,CAAC;IAED;;;;;OAKG;IACH,MAAM,KAAK,OAAO;QACd,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAEzB,OAAO,WAAW,EAAE,CAAC;IACzB,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,aAAa,CAAC,OAAmB;QACpC,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAEzB,UAAU,CAAC,OAAO,CAAC,CAAC;IACxB,CAAC;IAED;;;;;;;OAOG;IACH,MAAM,CAAC,gBAAgB;QACnB,+BAA+B;QAC/B,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACvB,IAAI,CAAC,eAAe,EAAE,CAAC;QAC3B,CAAC;QAED,uBAAuB;QACvB,cAAc,CAAC,KAAK,EAAE,CAAC;QACvB,gBAAgB,CAAC,KAAK,EAAE,CAAC;QAEzB,6BAA6B;QAC7B,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QAEzB,cAAc;QACd,IAAI,CAAC,KAAK,CAAC,gBAAgB,GAAG,IAAI,CAAC;IACvC,CAAC"}
@@ -2,6 +2,9 @@
2
2
  * React hook that provides a function to load a saved game by its ID.
3
3
  * Restores the game state from the specified save.
4
4
  *
5
+ * **Automatic Migration**: If the save version differs from the current game version,
6
+ * registered migrations will be automatically applied to bring the save data up to date.
7
+ *
5
8
  * @returns Function that accepts an optional save ID and loads the game, returning a result object on failure
6
9
  *
7
10
  * @example
@@ -1 +1 @@
1
- {"version":3,"file":"useLoadGame.d.ts","sourceRoot":"","sources":["../../../src/saves/hooks/useLoadGame.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,WAAW,SAAgB,IAAI,MAAM;;;cAmBjD,CAAC"}
1
+ {"version":3,"file":"useLoadGame.d.ts","sourceRoot":"","sources":["../../../src/saves/hooks/useLoadGame.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,WAAW,SAAgB,IAAI,MAAM;;;cAiDjD,CAAC"}
@@ -1,9 +1,13 @@
1
1
  import { Game } from "../../game";
2
2
  import { loadGame } from "../../saves";
3
+ import { migrateToCurrentVersion } from "../../saves/migrations";
3
4
  /**
4
5
  * React hook that provides a function to load a saved game by its ID.
5
6
  * Restores the game state from the specified save.
6
7
  *
8
+ * **Automatic Migration**: If the save version differs from the current game version,
9
+ * registered migrations will be automatically applied to bring the save data up to date.
10
+ *
7
11
  * @returns Function that accepts an optional save ID and loads the game, returning a result object on failure
8
12
  *
9
13
  * @example
@@ -26,7 +30,25 @@ export const useLoadGame = () => async (id) => {
26
30
  message: "The requested game save does not exist",
27
31
  };
28
32
  }
29
- Game.setState(data.gameData);
33
+ // Apply migrations if needed
34
+ const currentVersion = Game.options.gameVersion;
35
+ const saveVersion = data.version;
36
+ let gameData = data.gameData;
37
+ if (saveVersion !== currentVersion) {
38
+ const migrationResult = migrateToCurrentVersion(data.gameData, saveVersion);
39
+ if (!migrationResult.success) {
40
+ return {
41
+ success: false,
42
+ message: `Failed to migrate save from version ${saveVersion} to ${currentVersion}: ${migrationResult.error}`,
43
+ };
44
+ }
45
+ gameData = migrationResult.data;
46
+ // Log migration info for user visibility
47
+ if (migrationResult.migrationsApplied.length > 0) {
48
+ console.log(`Save migrated from version ${saveVersion} to ${currentVersion} (${migrationResult.migrationsApplied.length} step(s))`);
49
+ }
50
+ }
51
+ Game.setState(gameData);
30
52
  }
31
53
  catch (e) {
32
54
  console.error("Failed to load game:", e);
@@ -1 +1 @@
1
- {"version":3,"file":"useLoadGame.js","sourceRoot":"","sources":["../../../src/saves/hooks/useLoadGame.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAElC;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,GAAG,EAAE,CAAC,KAAK,EAAE,EAAU,EAAE,EAAE;IAClD,IAAI,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,EAAE,CAAC,CAAC;QAChC,IAAI,CAAC,IAAI,EAAE,CAAC;YACR,OAAO;gBACH,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,wCAAwC;aACpD,CAAC;QACN,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACjC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACT,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,CAAC,CAAC,CAAC;QACzC,OAAO;YACH,OAAO,EAAE,KAAK;YACd,OAAO,EACF,CAAW,CAAC,OAAO;gBACpB,mDAAmD;SAC1D,CAAC;IACN,CAAC;AACL,CAAC,CAAC"}
1
+ {"version":3,"file":"useLoadGame.js","sourceRoot":"","sources":["../../../src/saves/hooks/useLoadGame.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAClC,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAE5D;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,GAAG,EAAE,CAAC,KAAK,EAAE,EAAU,EAAE,EAAE;IAClD,IAAI,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,EAAE,CAAC,CAAC;QAChC,IAAI,CAAC,IAAI,EAAE,CAAC;YACR,OAAO;gBACH,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,wCAAwC;aACpD,CAAC;QACN,CAAC;QAED,6BAA6B;QAC7B,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;QAChD,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC;QAEjC,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAE7B,IAAI,WAAW,KAAK,cAAc,EAAE,CAAC;YACjC,MAAM,eAAe,GAAG,uBAAuB,CAC3C,IAAI,CAAC,QAAQ,EACb,WAAW,CACd,CAAC;YAEF,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC;gBAC3B,OAAO;oBACH,OAAO,EAAE,KAAK;oBACd,OAAO,EAAE,uCAAuC,WAAW,OAAO,cAAc,KAAK,eAAe,CAAC,KAAK,EAAE;iBAC/G,CAAC;YACN,CAAC;YAED,QAAQ,GAAG,eAAe,CAAC,IAAK,CAAC;YAEjC,yCAAyC;YACzC,IAAI,eAAe,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC/C,OAAO,CAAC,GAAG,CACP,8BAA8B,WAAW,OAAO,cAAc,KAAK,eAAe,CAAC,iBAAiB,CAAC,MAAM,WAAW,CACzH,CAAC;YACN,CAAC;QACL,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACT,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,CAAC,CAAC,CAAC;QACzC,OAAO;YACH,OAAO,EAAE,KAAK;YACd,OAAO,EACF,CAAW,CAAC,OAAO;gBACpB,mDAAmD;SAC1D,CAAC;IACN,CAAC;AACL,CAAC,CAAC"}
@@ -1,4 +1,5 @@
1
1
  export * from './db';
2
2
  export * from './hooks';
3
+ export * from './migrations';
3
4
  export type * from './types';
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/saves/index.ts"],"names":[],"mappings":"AAAA,cAAc,MAAM,CAAC;AACrB,cAAc,SAAS,CAAC;AACxB,mBAAmB,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/saves/index.ts"],"names":[],"mappings":"AAAA,cAAc,MAAM,CAAC;AACrB,cAAc,SAAS,CAAC;AACxB,cAAc,cAAc,CAAC;AAC7B,mBAAmB,SAAS,CAAC"}
@@ -1,3 +1,4 @@
1
1
  export * from './db';
2
2
  export * from './hooks';
3
+ export * from './migrations';
3
4
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/saves/index.ts"],"names":[],"mappings":"AAAA,cAAc,MAAM,CAAC;AACrB,cAAc,SAAS,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/saves/index.ts"],"names":[],"mappings":"AAAA,cAAc,MAAM,CAAC;AACrB,cAAc,SAAS,CAAC;AACxB,cAAc,cAAc,CAAC"}
@@ -0,0 +1,113 @@
1
+ /**
2
+ * EXAMPLE: Save Migration System Usage
3
+ *
4
+ * This file demonstrates how to use the save migration system in a real game.
5
+ * It shows a complete migration history from version 1.0.0 to 3.0.0.
6
+ */
7
+ /**
8
+ * Call this function during game initialization to register all migrations.
9
+ *
10
+ * @example
11
+ * ```typescript
12
+ * import { Game } from '@react-text-game/core';
13
+ * import { registerAllMigrations } from './migrations';
14
+ *
15
+ * async function initGame() {
16
+ * await Game.init({ gameVersion: "3.0.0", ... });
17
+ * registerAllMigrations();
18
+ * }
19
+ * ```
20
+ */
21
+ export declare function registerAllMigrations(): void;
22
+ /**
23
+ * Example test data for each version.
24
+ * Use these to test your migrations.
25
+ */
26
+ export declare const testSaves: {
27
+ "1.0.0": {
28
+ player: {
29
+ name: string;
30
+ hp: number;
31
+ mp: number;
32
+ maxHp: number;
33
+ maxMp: number;
34
+ level: number;
35
+ experience: number;
36
+ };
37
+ };
38
+ "1.1.0": {
39
+ player: {
40
+ name: string;
41
+ hp: number;
42
+ mp: number;
43
+ maxHp: number;
44
+ maxMp: number;
45
+ level: number;
46
+ experience: number;
47
+ inventory: string[];
48
+ };
49
+ };
50
+ "2.0.0": {
51
+ player: {
52
+ name: string;
53
+ level: number;
54
+ experience: number;
55
+ inventory: string[];
56
+ stats: {
57
+ health: number;
58
+ mana: number;
59
+ maxHealth: number;
60
+ maxMana: number;
61
+ strength: number;
62
+ intelligence: number;
63
+ agility: number;
64
+ };
65
+ };
66
+ quests: {
67
+ active: string[];
68
+ completed: string[];
69
+ };
70
+ };
71
+ };
72
+ /**
73
+ * Example test function to verify migrations work correctly.
74
+ *
75
+ * @example
76
+ * ```typescript
77
+ * import { testMigrationChain } from './migrations/example';
78
+ *
79
+ * // In your test file or dev console
80
+ * testMigrationChain();
81
+ * ```
82
+ */
83
+ export declare function testMigrationChain(): Promise<void>;
84
+ /**
85
+ * How to integrate this into your game:
86
+ *
87
+ * 1. Create a migrations file (like this one) in your game
88
+ * 2. Define migration functions for each version change
89
+ * 3. Call registerAllMigrations() after Game.init()
90
+ * 4. Migrations will automatically apply when players load old saves
91
+ *
92
+ * Example:
93
+ *
94
+ * ```typescript
95
+ * // src/index.tsx
96
+ * import { Game } from '@react-text-game/core';
97
+ * import { registerAllMigrations } from './game/migrations';
98
+ *
99
+ * async function init() {
100
+ * await Game.init({
101
+ * gameName: "My Adventure",
102
+ * gameVersion: "3.0.0",
103
+ * isDevMode: import.meta.env.DEV
104
+ * });
105
+ *
106
+ * registerAllMigrations();
107
+ *
108
+ * // Dev mode will validate your migration chain
109
+ * // and warn if there are any issues
110
+ * }
111
+ * ```
112
+ */
113
+ //# sourceMappingURL=EXAMPLE.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EXAMPLE.d.ts","sourceRoot":"","sources":["../../../src/saves/migrations/EXAMPLE.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA+KH;;;;;;;;;;;;;GAaG;AACH,wBAAgB,qBAAqB,SAYpC;AAMD;;;GAGG;AACH,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6CrB,CAAC;AAEF;;;;;;;;;;GAUG;AACH,wBAAsB,kBAAkB,kBAgCvC;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG"}
@@ -0,0 +1,304 @@
1
+ /**
2
+ * EXAMPLE: Save Migration System Usage
3
+ *
4
+ * This file demonstrates how to use the save migration system in a real game.
5
+ * It shows a complete migration history from version 1.0.0 to 3.0.0.
6
+ */
7
+ import { registerMigration } from "./index";
8
+ // ============================================================================
9
+ // MIGRATION HISTORY
10
+ // ============================================================================
11
+ /**
12
+ * Version 1.0.0 → 1.1.0
13
+ * Added: Inventory system
14
+ *
15
+ * In version 1.1.0, we added an inventory system to the game.
16
+ * Players who saved in 1.0.0 don't have an inventory field,
17
+ * so we add an empty array as the default.
18
+ *
19
+ * NOTE: This migration uses the generic type parameter to specify
20
+ * the exact shape of the data it operates on. This provides:
21
+ * - Better type safety when accessing save.player.inventory
22
+ * - IDE autocomplete for the specific fields
23
+ * - Compile-time validation of the migration logic
24
+ */
25
+ const migration_1_0_to_1_1 = {
26
+ from: "1.0.0",
27
+ to: "1.1.0",
28
+ description: "Added player inventory system",
29
+ migrate: (save) => {
30
+ const player = save.player || {};
31
+ return {
32
+ ...save,
33
+ player: {
34
+ ...player,
35
+ inventory: [],
36
+ },
37
+ };
38
+ },
39
+ };
40
+ /**
41
+ * Version 1.1.0 → 1.2.0
42
+ * Added: Quest tracking system
43
+ *
44
+ * We added a quest system with active and completed quests.
45
+ *
46
+ * NOTE: This migration does NOT use the generic type parameter,
47
+ * relying on the default GameSaveState type. This is fine for simple
48
+ * migrations where type safety is less critical. Use generics when:
49
+ * - You need type safety for complex nested structures
50
+ * - You want IDE autocomplete for specific fields
51
+ * - The migration logic is non-trivial and could benefit from type checking
52
+ */
53
+ const migration_1_1_to_1_2 = {
54
+ from: "1.1.0",
55
+ to: "1.2.0",
56
+ description: "Added quest tracking system",
57
+ migrate: (save) => ({
58
+ ...save,
59
+ quests: {
60
+ active: [],
61
+ completed: [],
62
+ },
63
+ }),
64
+ };
65
+ /**
66
+ * Version 1.2.0 → 2.0.0 (MAJOR VERSION)
67
+ * Changed: Renamed 'hp' to 'health', 'mp' to 'mana'
68
+ * Changed: Moved stats into a separate 'stats' object
69
+ *
70
+ * This is a breaking change that restructures how player stats are stored.
71
+ */
72
+ const migration_1_2_to_2_0 = {
73
+ from: "1.2.0",
74
+ to: "2.0.0",
75
+ description: "Restructured player stats: renamed hp→health, mp→mana, moved to stats object",
76
+ migrate: (save) => {
77
+ const player = save.player;
78
+ return {
79
+ ...save,
80
+ player: {
81
+ name: player.name,
82
+ level: player.level ?? 1,
83
+ experience: player.experience ?? 0,
84
+ inventory: player.inventory ?? [],
85
+ stats: {
86
+ health: player.hp ?? 100,
87
+ mana: player.mp ?? 50,
88
+ maxHealth: player.maxHp ?? 100,
89
+ maxMana: player.maxMp ?? 50,
90
+ strength: player.strength ?? 10,
91
+ intelligence: player.intelligence ?? 10,
92
+ agility: player.agility ?? 10,
93
+ },
94
+ },
95
+ };
96
+ },
97
+ };
98
+ /**
99
+ * Version 2.0.0 → 2.1.0
100
+ * Added: Skills system
101
+ * Added: Player location tracking
102
+ */
103
+ const migration_2_0_to_2_1 = {
104
+ from: "2.0.0",
105
+ to: "2.1.0",
106
+ description: "Added skills system and location tracking",
107
+ migrate: (save) => {
108
+ const player = (save.player || {});
109
+ return {
110
+ ...save,
111
+ player: {
112
+ ...player,
113
+ skills: {
114
+ combat: 1,
115
+ magic: 1,
116
+ crafting: 1,
117
+ },
118
+ location: {
119
+ passageId: "start",
120
+ zone: "village",
121
+ },
122
+ },
123
+ };
124
+ },
125
+ };
126
+ /**
127
+ * Version 2.1.0 → 3.0.0 (MAJOR VERSION)
128
+ * Changed: Completely redesigned inventory system
129
+ * - Old: Array of item names
130
+ * - New: Array of item objects with id, quantity, metadata
131
+ *
132
+ * This migration converts the old simple inventory to the new detailed format.
133
+ */
134
+ const migration_2_1_to_3_0 = {
135
+ from: "2.1.0",
136
+ to: "3.0.0",
137
+ description: "Redesigned inventory to use item objects instead of strings",
138
+ migrate: (save) => {
139
+ const player = save.player;
140
+ const oldInventory = (player.inventory || []);
141
+ // Count duplicate items
142
+ const itemCounts = new Map();
143
+ for (const itemName of oldInventory) {
144
+ itemCounts.set(itemName, (itemCounts.get(itemName) || 0) + 1);
145
+ }
146
+ // Convert to new format
147
+ const newInventory = Array.from(itemCounts.entries()).map(([name, quantity], index) => ({
148
+ id: `item_${index}`,
149
+ name,
150
+ quantity,
151
+ metadata: {},
152
+ }));
153
+ return {
154
+ ...save,
155
+ player: {
156
+ ...player,
157
+ inventory: newInventory,
158
+ },
159
+ };
160
+ },
161
+ };
162
+ // ============================================================================
163
+ // MIGRATION REGISTRATION
164
+ // ============================================================================
165
+ /**
166
+ * Call this function during game initialization to register all migrations.
167
+ *
168
+ * @example
169
+ * ```typescript
170
+ * import { Game } from '@react-text-game/core';
171
+ * import { registerAllMigrations } from './migrations';
172
+ *
173
+ * async function initGame() {
174
+ * await Game.init({ gameVersion: "3.0.0", ... });
175
+ * registerAllMigrations();
176
+ * }
177
+ * ```
178
+ */
179
+ export function registerAllMigrations() {
180
+ // Register in chronological order for clarity
181
+ // The order doesn't actually matter - the system uses BFS to find the path
182
+ registerMigration(migration_1_0_to_1_1);
183
+ registerMigration(migration_1_1_to_1_2);
184
+ registerMigration(migration_1_2_to_2_0);
185
+ registerMigration(migration_2_0_to_2_1);
186
+ registerMigration(migration_2_1_to_3_0);
187
+ console.log("✓ Registered 5 save migrations covering versions 1.0.0 → 3.0.0");
188
+ }
189
+ // ============================================================================
190
+ // TESTING MIGRATIONS
191
+ // ============================================================================
192
+ /**
193
+ * Example test data for each version.
194
+ * Use these to test your migrations.
195
+ */
196
+ export const testSaves = {
197
+ "1.0.0": {
198
+ player: {
199
+ name: "Hero",
200
+ hp: 80,
201
+ mp: 30,
202
+ maxHp: 100,
203
+ maxMp: 50,
204
+ level: 5,
205
+ experience: 1200,
206
+ },
207
+ },
208
+ "1.1.0": {
209
+ player: {
210
+ name: "Hero",
211
+ hp: 80,
212
+ mp: 30,
213
+ maxHp: 100,
214
+ maxMp: 50,
215
+ level: 5,
216
+ experience: 1200,
217
+ inventory: ["sword", "potion", "potion"],
218
+ },
219
+ },
220
+ "2.0.0": {
221
+ player: {
222
+ name: "Hero",
223
+ level: 5,
224
+ experience: 1200,
225
+ inventory: ["sword", "potion", "potion"],
226
+ stats: {
227
+ health: 80,
228
+ mana: 30,
229
+ maxHealth: 100,
230
+ maxMana: 50,
231
+ strength: 12,
232
+ intelligence: 8,
233
+ agility: 10,
234
+ },
235
+ },
236
+ quests: {
237
+ active: ["main_quest_1"],
238
+ completed: ["tutorial"],
239
+ },
240
+ },
241
+ };
242
+ /**
243
+ * Example test function to verify migrations work correctly.
244
+ *
245
+ * @example
246
+ * ```typescript
247
+ * import { testMigrationChain } from './migrations/example';
248
+ *
249
+ * // In your test file or dev console
250
+ * testMigrationChain();
251
+ * ```
252
+ */
253
+ export async function testMigrationChain() {
254
+ const { runMigrations } = await import("./runner");
255
+ console.group("Testing Save Migration Chain");
256
+ // Test 1.0.0 → 3.0.0 (full chain)
257
+ console.log("\nTest 1: Migrating from 1.0.0 to 3.0.0");
258
+ const result1 = runMigrations(testSaves["1.0.0"], "1.0.0", "3.0.0", {
259
+ verbose: true,
260
+ });
261
+ console.log(result1.success ? "✓ Success" : "✗ Failed:", result1.error || result1.data);
262
+ // Test 1.1.0 → 3.0.0 (partial chain)
263
+ console.log("\nTest 2: Migrating from 1.1.0 to 3.0.0");
264
+ const result2 = runMigrations(testSaves["1.1.0"], "1.1.0", "3.0.0");
265
+ console.log(result2.success ? "✓ Success" : "✗ Failed:", result2.error || result2.data);
266
+ // Test 2.0.0 → 3.0.0 (single migration)
267
+ console.log("\nTest 3: Migrating from 2.0.0 to 3.0.0");
268
+ const result3 = runMigrations(testSaves["2.0.0"], "2.0.0", "3.0.0");
269
+ console.log(result3.success ? "✓ Success" : "✗ Failed:", result3.error || result3.data);
270
+ console.groupEnd();
271
+ }
272
+ // ============================================================================
273
+ // USAGE IN YOUR GAME
274
+ // ============================================================================
275
+ /**
276
+ * How to integrate this into your game:
277
+ *
278
+ * 1. Create a migrations file (like this one) in your game
279
+ * 2. Define migration functions for each version change
280
+ * 3. Call registerAllMigrations() after Game.init()
281
+ * 4. Migrations will automatically apply when players load old saves
282
+ *
283
+ * Example:
284
+ *
285
+ * ```typescript
286
+ * // src/index.tsx
287
+ * import { Game } from '@react-text-game/core';
288
+ * import { registerAllMigrations } from './game/migrations';
289
+ *
290
+ * async function init() {
291
+ * await Game.init({
292
+ * gameName: "My Adventure",
293
+ * gameVersion: "3.0.0",
294
+ * isDevMode: import.meta.env.DEV
295
+ * });
296
+ *
297
+ * registerAllMigrations();
298
+ *
299
+ * // Dev mode will validate your migration chain
300
+ * // and warn if there are any issues
301
+ * }
302
+ * ```
303
+ */
304
+ //# sourceMappingURL=EXAMPLE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EXAMPLE.js","sourceRoot":"","sources":["../../../src/saves/migrations/EXAMPLE.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Save Migration System
3
+ *
4
+ * This module provides a complete solution for versioning and migrating game saves.
5
+ * It allows developers to register migration functions that transform save data
6
+ * from older versions to newer versions.
7
+ *
8
+ * ## Key Concepts
9
+ *
10
+ * - **Migration**: A function that transforms save data from version A to version B
11
+ * - **Migration Path**: A sequence of migrations needed to go from an old version to the current version
12
+ * - **Migration Chain**: Migrations are applied sequentially (1.0.0 → 1.1.0 → 1.2.0 → 2.0.0)
13
+ *
14
+ * ## Usage
15
+ *
16
+ * ```typescript
17
+ * import { registerMigration } from '@react-text-game/core/saves';
18
+ *
19
+ * // Register a migration when you make a breaking change
20
+ * registerMigration({
21
+ * from: "1.0.0",
22
+ * to: "1.1.0",
23
+ * description: "Added player inventory system",
24
+ * migrate: (data) => ({
25
+ * ...data,
26
+ * player: {
27
+ * ...data.player,
28
+ * inventory: [] // Add default value
29
+ * }
30
+ * })
31
+ * });
32
+ * ```
33
+ *
34
+ * Migrations are automatically applied when loading saves via `useLoadGame()`.
35
+ *
36
+ * @module saves/migrations
37
+ */
38
+ export { clearMigrations, findMigrationPath, getAllMigrations, registerMigration, validateMigrations, } from "./registry";
39
+ export { migrateToCurrentVersion, runMigrations } from "./runner";
40
+ export type { MigrationOptions, MigrationResult, SaveMigration, SaveMigrationFn, } from "./types";
41
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/saves/migrations/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAEH,OAAO,EACH,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,GACrB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,uBAAuB,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAClE,YAAY,EACR,gBAAgB,EAChB,eAAe,EACf,aAAa,EACb,eAAe,GAClB,MAAM,SAAS,CAAC"}