{"_id":"@amitkhare/indexed-storage","_rev":"4-519386a3be98f6b80e520b14eb8587d9","name":"@amitkhare/indexed-storage","dist-tags":{"latest":"1.2.0"},"versions":{"1.0.0":{"name":"@amitkhare/indexed-storage","version":"1.0.0","keywords":["indexeddb","storage","localStorage","browser","database","async","client-side","web-storage","javascript","typescript"],"author":{"name":"Amit Kumar Khare"},"license":"MIT","_id":"@amitkhare/indexed-storage@1.0.0","maintainers":[{"name":"amitkhare","email":"amit@khare.co.in"}],"homepage":"https://github.com/amitkhare/indexed-storage#readme","bugs":{"url":"https://github.com/amitkhare/indexed-storage/issues"},"dist":{"shasum":"1deb7fa4a035c2fc861b060563e9bfbc4eb64e28","tarball":"https://registry.npmjs.org/@amitkhare/indexed-storage/-/indexed-storage-1.0.0.tgz","fileCount":22,"integrity":"sha512-OU5PMsZUCM5FNQwwz0mX0GJ4SVF164dfczfKN3xZKKZINRe1fpsGTgdpkXqn+pY1tTXTudS061phcXknctsF6A==","signatures":[{"sig":"MEUCIQDuEU/owGKY94RmaKNydkIy0ZjSg7AChoManDnYMqMTcwIgF20Gx9EyB55b9zef4Gg4//qXvM6UcSxSLJoV8OG1M14=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":158258},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.esm.js","engines":{"node":">=14.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.esm.js","require":"./dist/index.js"}},"gitHead":"0fe7ee07a771da530f59969785be2c4840d1324a","scripts":{"dev":"rollup -c -w","test":"node test/run-tests.js","build":"rollup -c","clean":"rimraf dist","validate":"node scripts/validate-package.js","build:types":"tsc --emitDeclarationOnly","test:browser":"start test/browser-test.html","prepublishOnly":"npm run build && npm run build:types && npm run validate"},"_npmUser":{"name":"amitkhare","email":"amit@khare.co.in"},"repository":{"url":"git+https://github.com/amitkhare/indexed-storage.git","type":"git"},"_npmVersion":"10.9.2","description":"A modern, localStorage-like API for IndexedDB operations with type preservation and enhanced capabilities","directories":{},"_nodeVersion":"22.14.0","browserslist":["defaults","not IE 11"],"_hasShrinkwrap":false,"devDependencies":{"tslib":"2.8.1","rimraf":"^5.0.0","rollup":"^3.0.0","typescript":"5.8.3","@rollup/plugin-terser":"^0.4.0","@rollup/plugin-typescript":"12.1.2","@rollup/plugin-node-resolve":"^15.0.0"},"_npmOperationalInternal":{"tmp":"tmp/indexed-storage_1.0.0_1748783429831_0.5179037209097719","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@amitkhare/indexed-storage","version":"1.0.1","keywords":["indexeddb","storage","localStorage","browser","database","async","client-side","web-storage","javascript","typescript"],"author":{"name":"Amit Kumar Khare"},"license":"MIT","_id":"@amitkhare/indexed-storage@1.0.1","maintainers":[{"name":"amitkhare","email":"amit@khare.co.in"}],"homepage":"https://github.com/amitkhare/indexed-storage#readme","bugs":{"url":"https://github.com/amitkhare/indexed-storage/issues"},"dist":{"shasum":"0f54767cac71ec8b28c3d4e3b8c82e48c26c1691","tarball":"https://registry.npmjs.org/@amitkhare/indexed-storage/-/indexed-storage-1.0.1.tgz","fileCount":22,"integrity":"sha512-qKFnEYZXNG0kV0SRb8cG6cclYVlo8Q1pM3k9pwW+CUzQBzqmtMCtjUTFZnvHbxANEyy+fOfky3w7Ltpfg4lOBQ==","signatures":[{"sig":"MEUCIGYq7rFCc8gO78Io3/J4n1ar1rBouiNZRYzFH//PwcSXAiEA/+XKhk/risDXk1ba130StIZ1YYZ1W7HSXYikqZ+6qx4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":172239},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.esm.js","engines":{"node":">=14.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.esm.js","require":"./dist/index.js"}},"gitHead":"5799c1a373aef2052b0a3c347a9152e02aca20c5","scripts":{"dev":"rollup -c -w","test":"node test/run-tests.js","build":"rollup -c","clean":"rimraf dist","validate":"node scripts/validate-package.js","build:types":"tsc --emitDeclarationOnly","test:browser":"start test/browser-test.html","prepublishOnly":"npm run build && npm run build:types && npm run validate"},"_npmUser":{"name":"amitkhare","email":"amit@khare.co.in"},"repository":{"url":"git+https://github.com/amitkhare/indexed-storage.git","type":"git"},"_npmVersion":"10.9.2","description":"A modern, localStorage-like API for IndexedDB operations with type preservation and enhanced capabilities","directories":{},"_nodeVersion":"22.14.0","browserslist":["defaults","not IE 11"],"_hasShrinkwrap":false,"devDependencies":{"tslib":"2.8.1","rimraf":"^5.0.0","rollup":"^3.0.0","typescript":"5.8.3","@rollup/plugin-terser":"^0.4.0","@rollup/plugin-typescript":"12.1.2","@rollup/plugin-node-resolve":"^15.0.0"},"_npmOperationalInternal":{"tmp":"tmp/indexed-storage_1.0.1_1748786995349_0.9491262591124325","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@amitkhare/indexed-storage","version":"1.1.0","keywords":["indexeddb","storage","localStorage","browser","database","async","client-side","web-storage","multi-store","configurable","javascript","typescript"],"author":{"name":"Amit Kumar Khare"},"license":"MIT","_id":"@amitkhare/indexed-storage@1.1.0","maintainers":[{"name":"amitkhare","email":"amit@khare.co.in"}],"homepage":"https://github.com/amitkhare/indexed-storage#readme","bugs":{"url":"https://github.com/amitkhare/indexed-storage/issues"},"dist":{"shasum":"6cd6254f7d73efa0def36a808789c409a5ad4ae2","tarball":"https://registry.npmjs.org/@amitkhare/indexed-storage/-/indexed-storage-1.1.0.tgz","fileCount":22,"integrity":"sha512-FUMgHwXEwRlosRfSoan0Lx8AP1dzBNf/+Ozw+4C6+cno3OthTRthF0OCc4UvSA53yrnd5pUFlDSLQ5I+x7mMzw==","signatures":[{"sig":"MEYCIQCA/ZvQGXjbNfxxw5cEAGy91MI2ubLg+i/jGafYiJBDCwIhAJ1CMZQelNoAPpCobFv3mYGaPworyx68Ynd7gnA5zTEX","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":235833},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.esm.js","engines":{"node":">=14.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.esm.js","require":"./dist/index.js"}},"gitHead":"2b1067dab1a8bd68dd28156d827cddacfc32bfe6","scripts":{"dev":"rollup -c -w","test":"node test/run-tests.js","build":"rollup -c","clean":"rimraf dist","validate":"node scripts/validate-package.js","build:types":"tsc --emitDeclarationOnly","test:browser":"start test/browser-test.html","prepublishOnly":"npm run build && npm run build:types && npm run validate"},"_npmUser":{"name":"amitkhare","email":"amit@khare.co.in"},"repository":{"url":"git+https://github.com/amitkhare/indexed-storage.git","type":"git"},"_npmVersion":"10.9.2","description":"A modern, localStorage-like API for IndexedDB with multi-store support, configurable databases, and enhanced capabilities","directories":{},"_nodeVersion":"22.14.0","browserslist":["defaults","not IE 11"],"_hasShrinkwrap":false,"devDependencies":{"tslib":"2.8.1","rimraf":"^5.0.0","rollup":"^3.0.0","typescript":"5.8.3","@rollup/plugin-terser":"^0.4.0","@rollup/plugin-typescript":"12.1.2","@rollup/plugin-node-resolve":"^15.0.0"},"_npmOperationalInternal":{"tmp":"tmp/indexed-storage_1.1.0_1748877741224_0.9695627190904872","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@amitkhare/indexed-storage","version":"1.2.0","description":"A modern, localStorage-like API for IndexedDB with instance-based and static APIs, multi-store support, configurable databases, and enhanced capabilities","type":"module","main":"dist/index.js","module":"dist/index.esm.js","types":"dist/index.d.ts","exports":{".":{"import":"./dist/index.esm.js","require":"./dist/index.js","types":"./dist/index.d.ts"}},"scripts":{"build":"rollup -c","build:types":"tsc --emitDeclarationOnly","dev":"rollup -c -w","test":"node test/run-tests.js","test:browser":"start test/browser-test.html","validate":"node scripts/validate-package.js","prepublishOnly":"npm run build && npm run build:types && npm run validate","clean":"rimraf dist"},"keywords":["indexeddb","storage","localStorage","browser","database","async","client-side","web-storage","multi-store","multi-database","instance-based","configurable","constructor","class-based","javascript","typescript","modern","api"],"author":{"name":"Amit Kumar Khare"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/amitkhare/indexed-storage.git"},"bugs":{"url":"https://github.com/amitkhare/indexed-storage/issues"},"homepage":"https://github.com/amitkhare/indexed-storage#readme","devDependencies":{"@rollup/plugin-node-resolve":"^15.0.0","@rollup/plugin-terser":"^0.4.0","@rollup/plugin-typescript":"12.1.2","rimraf":"^5.0.0","rollup":"^3.0.0","tslib":"2.8.1","typescript":"5.8.3"},"engines":{"node":">=14.0.0"},"browserslist":["defaults","not IE 11"],"_id":"@amitkhare/indexed-storage@1.2.0","gitHead":"2b1067dab1a8bd68dd28156d827cddacfc32bfe6","_nodeVersion":"22.14.0","_npmVersion":"10.9.2","dist":{"integrity":"sha512-TJZ0o1kGn1wviu+pO9GCFfRwWVg+hCBt6gHcJ9PJTiMd06pzuWV6CuIQBndKlKVnNJswNmww7c8tDG2Eop1Dfg==","shasum":"45d73ef1d708d86cab834694c106418ea0d3f1f7","tarball":"https://registry.npmjs.org/@amitkhare/indexed-storage/-/indexed-storage-1.2.0.tgz","fileCount":22,"unpackedSize":282905,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQC6wiMwcRSHiv6f+RbN8LgPZYkG2eBQQ1zT01PsjR5i2gIhAPgIs9klOLnU7FbJHF6cavs8/A/YzKgJ6uNYgdw+B7S7"}]},"_npmUser":{"name":"amitkhare","email":"amit@khare.co.in"},"directories":{},"maintainers":[{"name":"amitkhare","email":"amit@khare.co.in"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/indexed-storage_1.2.0_1749829437677_0.8035472396731909"},"_hasShrinkwrap":false}},"time":{"created":"2025-06-01T13:10:29.764Z","modified":"2025-06-13T15:43:58.074Z","1.0.0":"2025-06-01T13:10:30.032Z","1.0.1":"2025-06-01T14:09:55.563Z","1.1.0":"2025-06-02T15:22:21.429Z","1.2.0":"2025-06-13T15:43:57.895Z"},"bugs":{"url":"https://github.com/amitkhare/indexed-storage/issues"},"author":{"name":"Amit Kumar Khare"},"license":"MIT","homepage":"https://github.com/amitkhare/indexed-storage#readme","keywords":["indexeddb","storage","localStorage","browser","database","async","client-side","web-storage","multi-store","multi-database","instance-based","configurable","constructor","class-based","javascript","typescript","modern","api"],"repository":{"type":"git","url":"git+https://github.com/amitkhare/indexed-storage.git"},"description":"A modern, localStorage-like API for IndexedDB with instance-based and static APIs, multi-store support, configurable databases, and enhanced capabilities","maintainers":[{"name":"amitkhare","email":"amit@khare.co.in"}],"readme":"# @amitkhare/indexed-storage\r\n\r\nA modern, localStorage-like API for IndexedDB that provides a simple and intuitive interface for client-side data storage with enhanced capabilities.\r\n\r\n## ✨ Features\r\n\r\n- **localStorage-like API** - Familiar `setItem()`, `getItem()`, `removeItem()` interface\r\n- **Type Preservation** - Stores and retrieves exact values (primitives, objects, arrays)\r\n- **Async/Await Support** - Modern Promise-based API\r\n- **Configurable Database** - Customize database name, version, and store name\r\n- **Multi-Store Support** - Multiple object stores within the same database\r\n- **Multiple Database Instances** - Create separate databases for different purposes\r\n- **Store-Specific APIs** - Isolated access to individual stores\r\n- **Batch Operations** - Get/set/remove multiple items at once\r\n- **Optional Logging** - Configurable console logging for debugging (disabled by default)\r\n- **TypeScript Ready** - Complete TypeScript declarations included\r\n- **Environment-Aware** - Easy configuration for development, staging, and production\r\n\r\n## 🚀 Installation\r\n\r\n```bash\r\nnpm install @amitkhare/indexed-storage\r\n```\r\n\r\n### Import\r\n\r\nIndexedStorage supports multiple import patterns for maximum flexibility:\r\n\r\n```javascript\r\n// Default import\r\nimport IndexedStorage from '@amitkhare/indexed-storage';\r\n\r\n// Named import  \r\nimport { IndexedStorage } from '@amitkhare/indexed-storage';\r\n\r\n// Import with utilities\r\nimport IndexedStorage, { useStorageManager, useIndexedDB } from '@amitkhare/indexed-storage';\r\n\r\n// Named import with utilities\r\nimport { IndexedStorage, useStorageManager, useIndexedDB } from '@amitkhare/indexed-storage';\r\n\r\n// TypeScript type imports\r\nimport { IndexedStorage, type IndexedStorageConfig } from '@amitkhare/indexed-storage';\r\n```\r\n\r\n### Basic Usage\r\n\r\n```javascript\r\n// Store data\r\nawait IndexedStorage.setItem('username', 'john_doe');\r\nawait IndexedStorage.setItem('count', 42);\r\nawait IndexedStorage.setItem('user', { name: 'John', age: 30 });\r\n\r\n// Retrieve data\r\nconst username = await IndexedStorage.getItem('username'); // 'john_doe'\r\nconst count = await IndexedStorage.getItem('count'); // 42\r\nconst user = await IndexedStorage.getItem('user'); // { name: 'John', age: 30 }\r\n\r\n// Check if item exists\r\nif (await IndexedStorage.hasItem('username')) {\r\n  console.log('Username is stored');\r\n}\r\n\r\n// Remove item\r\nawait IndexedStorage.removeItem('username');\r\n\r\n// Clear all data\r\nawait IndexedStorage.clear();\r\n```\r\n\r\n## 🔥 New Instance-based API\r\n\r\n**NEW:** Create multiple independent IndexedStorage instances with different configurations!\r\n\r\n### Multiple Independent Instances\r\n\r\n```javascript\r\n// Create separate storage instances for different purposes\r\nconst appStorage = new IndexedStorage({\r\n    dbName: 'MyApp',\r\n    storeName: 'settings',\r\n    logging: true\r\n});\r\n\r\nconst userStorage = new IndexedStorage({\r\n    dbName: 'UserData',  \r\n    storeName: 'profiles'\r\n});\r\n\r\nconst cacheStorage = new IndexedStorage({\r\n    dbName: 'Cache',\r\n    storeName: 'temp'\r\n});\r\n\r\n// Each instance operates independently\r\nawait appStorage.setItem('theme', 'dark');\r\nawait userStorage.setItem('currentUser', { id: 123, name: 'John' });\r\nawait cacheStorage.setItem('lastSync', Date.now());\r\n```\r\n\r\n### Instance Configuration Options\r\n\r\n```javascript\r\nconst storage = new IndexedStorage({\r\n    dbName: 'MyDatabase',        // Database name (default: 'IndexedStorage')\r\n    version: 1,                  // Database version (default: 1)\r\n    storeName: 'myStore',        // Default store name (default: 'data')\r\n    storeConfig: {               // Store configuration\r\n        keyPath: 'id',           // Key path for the store\r\n        autoIncrement: true      // Auto-increment keys\r\n    },\r\n    logging: true                // Enable logging (default: false)\r\n});\r\n```\r\n\r\n### Multi-Store within Single Database\r\n\r\n```javascript\r\n// Method 1: Create stores during initialization\r\nconst storage = new IndexedStorage({\r\n    dbName: 'ECommerceApp',\r\n    storeName: 'products', // default store\r\n    additionalStores: ['users', 'orders', 'cart'], // create these stores automatically\r\n    storeConfigs: {\r\n        users: { keyPath: 'id', autoIncrement: true },\r\n        orders: { keyPath: 'orderId', autoIncrement: false },\r\n        cart: { keyPath: null, autoIncrement: false }\r\n    }\r\n});\r\n\r\n// Method 2: Create stores dynamically\r\nconst storage2 = new IndexedStorage({\r\n    dbName: 'MyApp',\r\n    storeName: 'default'\r\n});\r\n\r\nawait storage2.createStore('users', { keyPath: 'id', autoIncrement: true });\r\nawait storage2.createStore('sessions', { keyPath: 'sessionId' });\r\n\r\n// Store data in different stores\r\nawait storage.setItem('prod1', { name: 'Laptop', price: 999 }, 'products');\r\nawait storage.setItem('user1', { name: 'John', email: 'john@example.com' }, 'users');\r\nawait storage.setItem('order1', { total: 999, items: ['prod1'] }, 'orders');\r\n\r\n// Get store-specific API for easier operations\r\nconst userStore = storage.getStore('users');\r\nconst orderStore = storage.getStore('orders');\r\n\r\nawait userStore.setItem('user2', { name: 'Jane', email: 'jane@example.com' });\r\nawait orderStore.setItem('order2', { total: 1500, items: ['prod1', 'prod2'] });\r\n\r\n// Batch operations across multiple stores\r\nawait storage.setMultipleStores({\r\n    products: { 'prod2': { name: 'Mouse', price: 29 } },\r\n    users: { 'user3': { name: 'Bob', email: 'bob@example.com' } }\r\n});\r\n\r\n// Get data from multiple stores\r\nconst multiData = await storage.getMultipleStores({\r\n    products: ['prod1', 'prod2'],\r\n    users: ['user1', 'user2']\r\n});\r\n\r\n// List all stores\r\nconst stores = await storage.listStores();\r\nconsole.log(stores); // ['products', 'users', 'orders', 'cart']\r\n\r\n// Get all data from all stores\r\nconst allData = await storage.getAllStoresData();\r\nconsole.log(allData); // { products: {...}, users: {...}, orders: {...}, cart: {...} }\r\n```\r\n\r\n### Instance Methods\r\n\r\n**Core Operations:**\r\n- `setItem(key, value, storeName?)` - Store an item\r\n- `getItem(key, storeName?)` - Retrieve an item  \r\n- `removeItem(key, storeName?)` - Remove an item\r\n- `clear(storeName?)` - Clear all items from a store\r\n\r\n**Batch Operations:**\r\n- `getAllKeys(storeName?)` - Get all keys\r\n- `getAllValues(storeName?)` - Get all values\r\n\r\n**Store Management:**\r\n- `createStore(name, config?)` - Create new store\r\n- `deleteStore(name)` - Delete a store\r\n- `listStores()` - List all stores\r\n- `getStoreInfo(name?)` - Get store information\r\n- `getAvailableStores()` - Get available stores (alias for listStores)\r\n\r\n**Multi-Store Operations:**\r\n- `getStore(storeName)` - Get store-specific API object\r\n- `getAllStoresData()` - Get data from all stores\r\n- `clearAllStores()` - Clear all stores in database\r\n- `setMultipleStores(storeData)` - Set data across multiple stores\r\n- `getMultipleStores(storeKeys)` - Get data from multiple stores\r\n\r\n**Database Management:**\r\n- `init()` - Initialize the database connection\r\n- `close()` - Close the database connection\r\n\r\n### Backward Compatibility\r\n\r\nThe original static API still works alongside the new instance API:\r\n\r\n```javascript\r\n// Static API (legacy) - still works\r\nawait IndexedStorage.setItem('key', 'value');\r\n\r\n// Instance API (new)\r\nconst storage = new IndexedStorage({ dbName: 'MyApp' });\r\nawait storage.setItem('key', 'value');\r\n```\r\n\r\n📖 **See [Instance API Guide](./docs/INSTANCE_API_GUIDE.md) for comprehensive examples and migration guide.**\r\n\r\n## ⚙️ Configuration\r\n\r\n### Enable/Disable Logging\r\n\r\nBy default, IndexedStorage operates silently. You can enable logging for debugging:\r\n\r\n```javascript\r\n// Enable logging for debugging (disabled by default)\r\nIndexedStorage.configure({ enableLogging: true });\r\n\r\n// Disable logging\r\nIndexedStorage.configure({ enableLogging: false });\r\n\r\n// Check current configuration\r\nconst config = IndexedStorage.getConfig();\r\nconsole.log(config); // { enableLogging: false }\r\n```\r\n\r\n### 🗄️ Configurable Database Settings\r\n\r\nIndexedStorage now supports configurable IndexedDB settings, allowing you to customize the database name, version, and store name for different applications and use cases.\r\n\r\n#### Basic Database Configuration\r\n\r\n```javascript\r\n// Configure custom database settings\r\nIndexedStorage.configure({\r\n  enableLogging: true,\r\n  indexedDB: {\r\n    dbName: 'MyApplication',        // Database name (default: 'LocalStorageDB')\r\n    dbVersion: 2,                   // Database version (default: 1)\r\n    storeName: 'appData'            // Object store name (default: 'localStates')\r\n  }\r\n});\r\n\r\n// All subsequent operations use the custom configuration\r\nawait IndexedStorage.setItem('user-data', { name: 'John' });\r\n```\r\n\r\n#### Multiple Database Instances\r\n\r\nCreate separate database instances for different purposes:\r\n\r\n```javascript\r\nimport { useIndexedDB, useStorageManager } from '@amitkhare/indexed-storage';\r\n\r\n// User data database\r\nconst userDB = useIndexedDB({\r\n  dbName: 'UserData',\r\n  dbVersion: 1,\r\n  storeName: 'users'\r\n});\r\n\r\n// Application cache database\r\nconst cacheDB = useIndexedDB({\r\n  dbName: 'AppCache',\r\n  dbVersion: 1,\r\n  storeName: 'cache'\r\n});\r\n\r\n// Store data in different databases\r\nawait userDB.save('profile', { name: 'John', email: 'john@example.com' });\r\nawait cacheDB.save('api-data', { response: {...}, timestamp: Date.now() });\r\n```\r\n\r\n#### Multi-Store Configuration\r\n\r\nUse multiple object stores within the same database:\r\n\r\n```javascript\r\n// Configure with multiple stores in the same database\r\nIndexedStorage.configure({\r\n  enableLogging: true,\r\n  indexedDB: {\r\n    dbName: 'MyApplication',\r\n    dbVersion: 1,\r\n    storeName: 'users',                           // Primary store\r\n    additionalStores: ['cache', 'analytics', 'settings'] // Additional stores\r\n  }\r\n});\r\n\r\n// Get store-specific APIs\r\nconst userStore = IndexedStorage.getStore('users');\r\nconst cacheStore = IndexedStorage.getStore('cache');\r\nconst analyticsStore = IndexedStorage.getStore('analytics');\r\n\r\n// Use each store independently\r\nawait userStore.setItem('profile', { name: 'John' });\r\nawait cacheStore.setItem('api-data', { response: 'cached' });\r\nawait analyticsStore.setItem('event-1', { action: 'click' });\r\n```\r\n\r\n#### Environment-Specific Configuration\r\n\r\n```javascript\r\nconst isDevelopment = process.env.NODE_ENV === 'development';\r\n\r\nIndexedStorage.configure({\r\n  enableLogging: isDevelopment,\r\n  indexedDB: {\r\n    dbName: isDevelopment ? 'MyApp_Development' : 'MyApp_Production',\r\n    dbVersion: isDevelopment ? 1 : 2,\r\n    storeName: 'appData'\r\n  }\r\n});\r\n```\r\n\r\n📖 **See [Configurable Database Guide](./docs/CONFIGURABLE_DATABASE.md) for comprehensive examples and best practices.**\r\n\r\n📖 **See [Multi-Store Usage Example](./examples/multi-store-usage.js) for comprehensive multi-store examples.**\r\n\r\n📖 **See [Migration Guide](./docs/MIGRATION_GUIDE.md) for upgrading to multi-store functionality.**\r\n\r\n## 📚 API Reference\r\n\r\n### Core Methods\r\n\r\n#### `getItem(key)`\r\nRetrieves an item from storage.\r\n- **Returns:** The stored value or null if not found\r\n\r\n#### `setItem(key, value)`\r\nStores an item in storage.\r\n- **Supports:** All JSON-serializable data types\r\n\r\n#### `removeItem(key)`\r\nRemoves an item from storage.\r\n\r\n#### `hasItem(key)`\r\nChecks if an item exists in storage.\r\n- **Returns:** `true` if the key exists\r\n\r\n#### `clear()`\r\nRemoves all items from storage.\r\n\r\n#### `getAllKeys()`\r\nGets all keys from storage.\r\n- **Returns:** Array of all keys\r\n\r\n#### `length()`\r\nGets the number of items in storage.\r\n\r\n### Batch Operations\r\n\r\n#### `getMultiple(keys)`\r\nRetrieves multiple items at once.\r\n\r\n```javascript\r\nconst data = await IndexedStorage.getMultiple(['user', 'settings']);\r\n// Returns: { user: {...}, settings: {...} }\r\n```\r\n\r\n#### `setMultiple(items)`\r\nStores multiple items at once.\r\n\r\n```javascript\r\nawait IndexedStorage.setMultiple({\r\n  'user': { name: 'John' },\r\n  'settings': { theme: 'dark' }\r\n});\r\n```\r\n\r\n#### `removeMultiple(keys)`\r\nRemoves multiple items at once.\r\n\r\n```javascript\r\nawait IndexedStorage.removeMultiple(['temp1', 'temp2']);\r\n```\r\n\r\n### Multi-Store Operations\r\n\r\n#### `getStore(storeName)`\r\nGet a store-specific API for working with a particular store.\r\n\r\n```javascript\r\nconst cacheStore = IndexedStorage.getStore('cache');\r\nawait cacheStore.setItem('key', 'value');\r\nconst value = await cacheStore.getItem('key');\r\n```\r\n\r\n#### `getAvailableStores()`\r\nGet list of all available stores in the database.\r\n\r\n```javascript\r\nconst stores = IndexedStorage.getAvailableStores();\r\nconsole.log(stores); // ['users', 'cache', 'analytics', 'settings']\r\n```\r\n\r\n#### `getAllStoresData()`\r\nGet all data from all stores at once.\r\n\r\n```javascript\r\nconst allData = await IndexedStorage.getAllStoresData();\r\n// Returns: { users: [...], cache: [...], analytics: [...] }\r\n```\r\n\r\n#### `clearAllStores()`\r\nClear all data from all stores.\r\n\r\n```javascript\r\nawait IndexedStorage.clearAllStores();\r\n```\r\n\r\n## 🎯 Usage Examples\r\n\r\n### Application State\r\n```javascript\r\n// Save application state\r\nawait IndexedStorage.setItem('app-state', {\r\n  currentView: 'dashboard',\r\n  sidebarCollapsed: true,\r\n  activeProject: 'project-123'\r\n});\r\n\r\n// Restore state on reload\r\nconst appState = await IndexedStorage.getItem('app-state');\r\nif (appState) {\r\n  navigateToView(appState.currentView);\r\n  setSidebarState(appState.sidebarCollapsed);\r\n}\r\n```\r\n\r\n### User Preferences\r\n```javascript\r\n// Save user preferences\r\nawait IndexedStorage.setItem('user-preferences', {\r\n  theme: 'dark',\r\n  language: 'en',\r\n  notifications: true\r\n});\r\n\r\n// Load preferences on app start\r\nconst prefs = await IndexedStorage.getItem('user-preferences');\r\nif (prefs) {\r\n  applyTheme(prefs.theme);\r\n  setLanguage(prefs.language);\r\n}\r\n```\r\n\r\n### Caching Data\r\n```javascript\r\n// Cache API responses\r\nawait IndexedStorage.setItem('api-cache-users', {\r\n  data: usersData,\r\n  timestamp: Date.now(),\r\n  expires: Date.now() + (1000 * 60 * 60) // 1 hour\r\n});\r\n\r\n// Check cache before API call\r\nconst cachedUsers = await IndexedStorage.getItem('api-cache-users');\r\nif (cachedUsers && Date.now() < cachedUsers.expires) {\r\n  return cachedUsers.data;\r\n}\r\n```\r\n\r\n### Multi-Store Application\r\n```javascript\r\n// Configure multi-store database\r\nIndexedStorage.configure({\r\n  indexedDB: {\r\n    dbName: 'TodoApp',\r\n    dbVersion: 1,\r\n    storeName: 'todos',\r\n    additionalStores: ['cache', 'analytics', 'settings']\r\n  }\r\n});\r\n\r\n// Use different stores for different purposes\r\nconst todoStore = IndexedStorage.getStore('todos');\r\nconst cacheStore = IndexedStorage.getStore('cache');\r\nconst analyticsStore = IndexedStorage.getStore('analytics');\r\nconst settingsStore = IndexedStorage.getStore('settings');\r\n\r\n// Store todos\r\nawait todoStore.setItem('todo-1', {\r\n  title: 'Buy groceries',\r\n  completed: false,\r\n  createdAt: new Date().toISOString()\r\n});\r\n\r\n// Cache API response\r\nawait cacheStore.setItem('/api/weather', {\r\n  data: { temperature: 22, condition: 'sunny' },\r\n  timestamp: Date.now(),\r\n  ttl: 300000 // 5 minutes\r\n});\r\n\r\n// Track user events\r\nawait analyticsStore.setItem('event-' + Date.now(), {\r\n  action: 'todo-created',\r\n  timestamp: Date.now(),\r\n  userAgent: navigator.userAgent\r\n});\r\n\r\n// Save app settings\r\nawait settingsStore.setItem('app-config', {\r\n  theme: 'dark',\r\n  notifications: true,\r\n  autoSave: true\r\n});\r\n\r\n// Get data from all stores\r\nconst allData = await IndexedStorage.getAllStoresData();\r\nconsole.log('All stores data:', allData);\r\n```\r\n\r\n## 🔧 Error Handling\r\n\r\nIndexedStorage includes comprehensive error handling:\r\n\r\n```javascript\r\ntry {\r\n  await IndexedStorage.setItem('large-data', massiveObject);\r\n} catch (error) {\r\n  console.error('Failed to store data:', error);\r\n  // Handle storage quota exceeded, etc.\r\n}\r\n\r\n// Check availability before using\r\nif (await IndexedStorage.isAvailable()) {\r\n  // Safe to proceed\r\n} else {\r\n  // Fallback to localStorage or other storage\r\n}\r\n```\r\n\r\n## 🔄 Migration from localStorage\r\n\r\nIndexedStorage is designed as a drop-in replacement for localStorage with async operations:\r\n\r\n```javascript\r\n// localStorage (synchronous)\r\nlocalStorage.setItem('key', JSON.stringify(data));\r\nconst data = JSON.parse(localStorage.getItem('key') || '{}');\r\n\r\n// IndexedStorage (asynchronous)\r\nawait IndexedStorage.setItem('key', data);\r\nconst data = await IndexedStorage.getItem('key');\r\n```\r\n\r\n## 📄 License\r\n\r\nMIT License - see [LICENSE](LICENSE) file for details.\r\n\r\n## 🤝 Contributing\r\n\r\nContributions are welcome! See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.\r\n","readmeFilename":"README.md"}