* Load data from storage and return as a Map * @param parser - The parser to use for deserializing the data * @param storageKey - The key used to store data in the storage API * @param storage - The storage API to load from (localStorage, sessionStorage, etc.) * @returns Map of stored items with
( storageKey: string, storage: StorageApi, parser: Parser, )
| 630 | * @returns Map of stored items with version tracking, or empty Map if loading fails |
| 631 | */ |
| 632 | function loadFromStorage<T extends object>( |
| 633 | storageKey: string, |
| 634 | storage: StorageApi, |
| 635 | parser: Parser, |
| 636 | ): Map<string | number, StoredItem<T>> { |
| 637 | try { |
| 638 | const rawData = storage.getItem(storageKey) |
| 639 | if (!rawData) { |
| 640 | return new Map() |
| 641 | } |
| 642 | |
| 643 | const parsed = parser.parse(rawData) |
| 644 | const dataMap = new Map<string | number, StoredItem<T>>() |
| 645 | |
| 646 | // Handle object format where keys map to StoredItem values |
| 647 | if ( |
| 648 | typeof parsed === `object` && |
| 649 | parsed !== null && |
| 650 | !Array.isArray(parsed) |
| 651 | ) { |
| 652 | Object.entries(parsed).forEach(([encodedKey, value]) => { |
| 653 | // Runtime check to ensure the value has the expected StoredItem structure |
| 654 | if ( |
| 655 | value && |
| 656 | typeof value === `object` && |
| 657 | `versionKey` in value && |
| 658 | `data` in value |
| 659 | ) { |
| 660 | const storedItem = value as StoredItem<T> |
| 661 | const decodedKey = decodeStorageKey(encodedKey) |
| 662 | dataMap.set(decodedKey, storedItem) |
| 663 | } else { |
| 664 | throw new InvalidStorageDataFormatError(storageKey, encodedKey) |
| 665 | } |
| 666 | }) |
| 667 | } else { |
| 668 | throw new InvalidStorageObjectFormatError(storageKey) |
| 669 | } |
| 670 | |
| 671 | return dataMap |
| 672 | } catch (error) { |
| 673 | console.warn( |
| 674 | `[LocalStorageCollection] Error loading data from storage key "${storageKey}":`, |
| 675 | error, |
| 676 | ) |
| 677 | return new Map() |
| 678 | } |
| 679 | } |
| 680 | |
| 681 | /** |
| 682 | * Internal function to create localStorage sync configuration |
no test coverage detected