{"_id":"@angular-storage-expiry/storage-expiry","name":"@angular-storage-expiry/storage-expiry","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"@angular-storage-expiry/storage-expiry","version":"1.0.0","description":"Angular Local Storage with Expiry - SSR-safe, type-safe storage service with automatic expiry","keywords":["angular","localStorage","sessionStorage","expiry","ttl","storage","ssr","standalone","typescript"],"author":{"name":"Aman Kumar","email":"amankumardk1@gmail.com"},"license":"","repository":{"type":"git","url":"git+https://github.com/zxaman/angular-storage-expiry.git"},"homepage":"https://github.com/zxaman/angular-storage-expiry#readme","bugs":{"url":"https://github.com/zxaman/angular-storage-expiry/issues"},"peerDependencies":{"@angular/common":"^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0","@angular/core":"^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0"},"dependencies":{"tslib":"^2.3.0"},"sideEffects":false,"module":"fesm2022/angular-storage-expiry-storage-expiry.mjs","typings":"types/angular-storage-expiry-storage-expiry.d.ts","exports":{"./package.json":{"default":"./package.json"},".":{"types":"./types/angular-storage-expiry-storage-expiry.d.ts","default":"./fesm2022/angular-storage-expiry-storage-expiry.mjs"}},"gitHead":"40b4a64ab543278b8a819c50cd4cb5224a6a27de","_id":"@angular-storage-expiry/storage-expiry@1.0.0","_nodeVersion":"24.11.1","_npmVersion":"11.6.2","dist":{"integrity":"sha512-jMmudzH2R3kKgwmgt1upA5GU5uKFUQh3Vp/bHzqR6N1qcrnrD3i9dS5ZCKiPMcG95TGb7qa8CRBNm5lQsBYTrQ==","shasum":"7411b1d353ccb4744fec7ad07c61413271e4cb90","tarball":"https://registry.npmjs.org/@angular-storage-expiry/storage-expiry/-/storage-expiry-1.0.0.tgz","fileCount":5,"unpackedSize":53905,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIEzDNwzMeHxpYsU6qJ/dXObYv3PhgaRl3v+z+yeuZDd3AiBqgrcpdXA4z0zys5w7q9MxsvEtDD0FYOIBpw7e6xD3VA=="}]},"_npmUser":{"name":"aman_kumar909","email":"amankumardk1@gmail.com"},"directories":{},"maintainers":[{"name":"aman_kumar909","email":"amankumardk1@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/storage-expiry_1.0.0_1768680728803_0.06835741488074576"},"_hasShrinkwrap":false}},"time":{"created":"2026-01-17T20:12:08.700Z","1.0.0":"2026-01-17T20:12:08.995Z","modified":"2026-01-17T20:12:09.252Z"},"maintainers":[{"name":"aman_kumar909","email":"amankumardk1@gmail.com"}],"description":"Angular Local Storage with Expiry - SSR-safe, type-safe storage service with automatic expiry","homepage":"https://github.com/zxaman/angular-storage-expiry#readme","keywords":["angular","localStorage","sessionStorage","expiry","ttl","storage","ssr","standalone","typescript"],"repository":{"type":"git","url":"git+https://github.com/zxaman/angular-storage-expiry.git"},"author":{"name":"Aman Kumar","email":"amankumardk1@gmail.com"},"bugs":{"url":"https://github.com/zxaman/angular-storage-expiry/issues"},"readme":"# @angular-storage-expiry/storage-expiry\n\n> **Angular Storage with Automatic Expiry** - A production-ready, SSR-safe storage service that solves real problems developers face every day with browser localStorage.\n\n[![npm version](https://img.shields.io/npm/v/@angular-storage-expiry/storage-expiry.svg)](https://www.npmjs.com/package/@angular-storage-expiry/storage-expiry)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\n---\n\n## 📦 Package Name\n\n**`@angular-storage-expiry/storage-expiry`**\n\nInstall it with:\n```bash\nnpm install @angular-storage-expiry/storage-expiry\n```\n\n---\n\n## 🔴 The Real Problems Developers Face Today\n\n### Problem 1: No Expiry = Stale Data Bugs\n\n**What happens:**\n```typescript\n// Developer stores auth token\nlocalStorage.setItem('token', jwtToken);\n\n// User closes browser, comes back 2 months later\n// App still thinks user is logged in\nconst token = localStorage.getItem('token'); // Still there! 😱\n\n// User clicks something → API returns 401\n// App crashes or shows confusing error\n// User frustrated, thinks app is broken\n```\n\n**User Experience Impact:**\n- ❌ User sees \"You are logged in\" but can't access anything\n- ❌ Random errors when clicking buttons\n- ❌ Confusing logout messages\n- ❌ User loses trust in the application\n\n**What this package solves:**\n```typescript\n// ✅ Token expires automatically\nstorage.set('token', jwtToken, 15); // 15 minutes\n\n// After expiry, returns null automatically\nconst token = storage.get<string>('token'); // null if expired\n\n// App can handle gracefully → redirect to login\n// User experience: smooth, predictable\n```\n\n---\n\n### Problem 2: SSR Crashes = Broken SEO & Universal Apps\n\n**What happens:**\n```typescript\n// Developer uses localStorage directly\nexport class UserService {\n  getUser() {\n    return JSON.parse(localStorage.getItem('user') || '{}');\n  }\n}\n\n// Deploys to Angular Universal (SSR)\n// Server tries to render page\n// 💥 CRASH: ReferenceError: localStorage is not defined\n// Page doesn't render → SEO fails\n// Search engines see blank page\n```\n\n**User Experience Impact:**\n- ❌ App doesn't work with Angular Universal\n- ❌ SEO completely broken\n- ❌ Slow page loads (no server-side rendering)\n- ❌ Poor search engine rankings\n\n**What this package solves:**\n```typescript\n// ✅ Automatically detects platform\n// On server: returns null safely\n// On browser: works normally\nconst user = storage.get<User>('user'); // Works everywhere!\n\n// SEO works perfectly\n// Fast initial page load\n// Search engines see content\n```\n\n---\n\n### Problem 3: JSON Parsing Errors = App Crashes\n\n**What happens:**\n```typescript\n// Developer forgets error handling\nconst user = JSON.parse(localStorage.getItem('user') || '{}');\n\n// User manually clears storage\n// Or storage gets corrupted\n// 💥 CRASH: SyntaxError: Unexpected token\n// Entire app breaks\n// User sees white screen of death\n```\n\n**User Experience Impact:**\n- ❌ App completely breaks\n- ❌ White screen of death\n- ❌ User has to refresh page\n- ❌ Data loss\n\n**What this package solves:**\n```typescript\n// ✅ Safe parsing built-in\nconst user = storage.get<User>('user'); // Never crashes!\n\n// Returns null if corrupted\n// App continues working\n// User experience: smooth, no crashes\n```\n\n---\n\n### Problem 4: Repeated Boilerplate = Maintenance Nightmare\n\n**What happens:**\n```typescript\n// Developer writes this in 20 different places\ntry {\n  const data = JSON.parse(localStorage.getItem('key') || '{}');\n  if (data.expiry && Date.now() > data.expiry) {\n    localStorage.removeItem('key');\n    return null;\n  }\n  return data.value;\n} catch (e) {\n  localStorage.removeItem('key');\n  return null;\n}\n\n// Bug found? Fix it in 20 places\n// New requirement? Update 20 places\n// Testing? Mock localStorage 20 times\n```\n\n**User Experience Impact:**\n- ❌ Inconsistent behavior across app\n- ❌ Bugs take longer to fix\n- ❌ More bugs = worse UX\n\n**What this package solves:**\n```typescript\n// ✅ One line, everywhere\nconst user = storage.get<User>('user');\n\n// Bug fix? One place\n// New feature? One place\n// Testing? Mock one service\n// Consistent behavior everywhere\n```\n\n---\n\n### Problem 5: No Type Safety = Runtime Errors\n\n**What happens:**\n```typescript\n// Developer gets data\nconst user = JSON.parse(localStorage.getItem('user') || '{}');\n\n// TypeScript thinks it's 'any'\n// No autocomplete\n// Developer makes typo\nuser.nmae // Typo! But TypeScript doesn't catch it\n\n// Runtime error: Cannot read property 'nmae' of undefined\n// User sees error message\n```\n\n**User Experience Impact:**\n- ❌ More bugs in production\n- ❌ Runtime errors users see\n- ❌ Slower development = slower features\n\n**What this package solves:**\n```typescript\n// ✅ Full type safety\nconst user = storage.get<User>('user');\n\n// TypeScript knows the type\n// Autocomplete works\n// Catches errors at compile time\n// Better code = better UX\n```\n\n---\n\n## ✅ How This Package Solves Everything\n\n### 🎯 Solution Overview\n\nThis package provides a **single, centralized service** that:\n\n1. ✅ **Automatic Expiry** - Data expires on its own, no stale data\n2. ✅ **SSR Safe** - Works perfectly with Angular Universal\n3. ✅ **Error Handling** - Never crashes, always returns safely\n4. ✅ **Type Safety** - Full TypeScript support with generics\n5. ✅ **Clean API** - One service, used everywhere\n6. ✅ **Auto Cleanup** - Expired items removed automatically\n\n### 🚀 Result: Smooth User Experience\n\n- ✅ **Predictable behavior** - Users know what to expect\n- ✅ **No random errors** - App handles expired data gracefully\n- ✅ **Fast loading** - SSR works, SEO works\n- ✅ **Reliable** - No crashes from corrupted data\n- ✅ **Secure** - Tokens expire automatically\n\n---\n\n## 📦 Installation\n\n```bash\nnpm install @angular-storage-expiry/storage-expiry\n```\n\n---\n\n## 🚀 Quick Start Guide\n\n### Step 1: Configure (Choose One)\n\n**For Standalone Angular (Angular 16+):**\n```typescript\nimport { bootstrapApplication } from '@angular/platform-browser';\nimport { provideStorage } from '@angular-storage-expiry/storage-expiry';\nimport { AppComponent } from './app.component';\n\nbootstrapApplication(AppComponent, {\n  providers: [\n    provideStorage({\n      prefix: 'myApp_',        // Optional: prefix all keys\n      defaultExpiry: 60        // Optional: default 60 minutes\n    })\n  ]\n});\n```\n\n**For NgModule Angular:**\n```typescript\nimport { NgModule } from '@angular/core';\nimport { StorageModule } from '@angular-storage-expiry/storage-expiry';\n\n@NgModule({\n  imports: [\n    StorageModule.forRoot({\n      prefix: 'myApp_',\n      defaultExpiry: 60\n    })\n  ]\n})\nexport class AppModule {}\n```\n\n### Step 2: Use in Your Code\n\n```typescript\nimport { Component, inject } from '@angular/core';\nimport { StorageService } from '@angular-storage-expiry/storage-expiry';\n\n@Component({...})\nexport class MyComponent {\n  private storage = inject(StorageService);\n  \n  // Store data with expiry\n  saveUser(user: User) {\n    this.storage.set('user', user, 60); // Expires in 60 minutes\n  }\n  \n  // Get data (type-safe, auto-expiry check)\n  getUser(): User | null {\n    return this.storage.get<User>('user'); // Returns null if expired\n  }\n}\n```\n\nThat's it! You're ready to go.\n\n---\n\n## 💻 Complete Usage Guide\n\n### Storing Data\n\n```typescript\n// Store with specific expiry (in minutes)\nthis.storage.set('token', jwtToken, 15); // 15 minutes\n\n// Store with default expiry (from config)\nthis.storage.set('user', userData); // Uses defaultExpiry\n\n// Store without expiry\nthis.storage.set('theme', 'dark', 0); // Never expires\n```\n\n### Retrieving Data\n\n```typescript\n// Get with type safety\nconst user = this.storage.get<User>('user');\n// Returns: User | null (null if expired or not found)\n\n// Check if exists (and not expired)\nif (this.storage.has('token')) {\n  const token = this.storage.get<string>('token');\n}\n\n// Get all keys\nconst keys = this.storage.keys(); // ['user', 'token', ...]\n```\n\n### Removing Data\n\n```typescript\n// Remove specific key\nthis.storage.remove('token');\n\n// Clear all (respects prefix if configured)\nthis.storage.clear();\n\n// Clean expired items manually\nthis.storage.cleanExpired();\n```\n\n---\n\n## 🏗️ Real-World Examples\n\n### Example 1: Authentication Service\n\n**Problem Solved:** Tokens expire automatically, no stale auth state\n\n```typescript\nimport { Injectable, inject } from '@angular/core';\nimport { StorageService } from '@angular-storage-expiry/storage-expiry';\nimport { Router } from '@angular/router';\n\n@Injectable({ providedIn: 'root' })\nexport class AuthService {\n  private storage = inject(StorageService);\n  private router = inject(Router);\n  \n  login(accessToken: string, refreshToken: string) {\n    // Access token: short-lived for security\n    this.storage.set('accessToken', accessToken, 15); // 15 min\n    \n    // Refresh token: longer for seamless UX\n    this.storage.set('refreshToken', refreshToken, 7 * 24 * 60); // 7 days\n  }\n  \n  getAccessToken(): string | null {\n    const token = this.storage.get<string>('accessToken');\n    \n    // If expired, try to refresh\n    if (!token) {\n      this.refreshToken();\n      return this.storage.get<string>('accessToken');\n    }\n    \n    return token;\n  }\n  \n  private refreshToken() {\n    const refreshToken = this.storage.get<string>('refreshToken');\n    if (refreshToken) {\n      // Call API to get new access token\n      // User stays logged in seamlessly\n    } else {\n      // Both expired, redirect to login\n      this.router.navigate(['/login']);\n    }\n  }\n  \n  logout() {\n    this.storage.remove('accessToken');\n    this.storage.remove('refreshToken');\n  }\n  \n  isAuthenticated(): boolean {\n    return this.storage.has('accessToken');\n  }\n}\n```\n\n**User Experience:**\n- ✅ User stays logged in seamlessly (token refresh)\n- ✅ Automatic logout when session expires\n- ✅ No confusing \"logged in but can't access\" states\n\n---\n\n### Example 2: Shopping Cart\n\n**Problem Solved:** Cart expires after reasonable time, prevents stale data\n\n```typescript\nimport { Injectable, inject } from '@angular/core';\nimport { StorageService } from '@angular-storage-expiry/storage-expiry';\n\ninterface CartItem {\n  productId: string;\n  quantity: number;\n  price: number;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class CartService {\n  private storage = inject(StorageService);\n  \n  saveCart(items: CartItem[]) {\n    // Cart expires in 7 days\n    this.storage.set('cart', items, 7 * 24 * 60);\n  }\n  \n  getCart(): CartItem[] {\n    const cart = this.storage.get<CartItem[]>('cart');\n    return cart || []; // Return empty array if expired\n  }\n  \n  addItem(item: CartItem) {\n    const cart = this.getCart();\n    cart.push(item);\n    this.saveCart(cart);\n  }\n  \n  clearCart() {\n    this.storage.remove('cart');\n  }\n}\n```\n\n**User Experience:**\n- ✅ Cart persists across sessions\n- ✅ Expires after 7 days (prevents stale data)\n- ✅ User can continue shopping seamlessly\n\n---\n\n### Example 3: User Preferences\n\n**Problem Solved:** Preferences persist, no expiry needed\n\n```typescript\nimport { Injectable, inject } from '@angular/core';\nimport { StorageService } from '@angular-storage-expiry/storage-expiry';\n\n@Injectable({ providedIn: 'root' })\nexport class PreferencesService {\n  private storage = inject(StorageService);\n  \n  saveTheme(theme: 'light' | 'dark') {\n    // No expiry for user preferences\n    this.storage.set('theme', theme, 0);\n  }\n  \n  getTheme(): 'light' | 'dark' {\n    return this.storage.get<'light' | 'dark'>('theme') || 'light';\n  }\n  \n  saveLanguage(lang: string) {\n    this.storage.set('language', lang, 0);\n  }\n  \n  getLanguage(): string {\n    return this.storage.get<string>('language') || 'en';\n  }\n}\n```\n\n**User Experience:**\n- ✅ Preferences persist forever\n- ✅ User doesn't have to reconfigure\n- ✅ Smooth, personalized experience\n\n---\n\n## ⚙️ Configuration Options\n\n```typescript\ninterface StorageConfig {\n  /**\n   * Prefix for all storage keys\n   * Useful for namespacing in multi-app scenarios\n   * @default ''\n   * @example 'myApp_' → keys become 'myApp_user', 'myApp_token'\n   */\n  prefix?: string;\n\n  /**\n   * Default expiry time in minutes\n   * Applied when set() is called without expiry parameter\n   * @default undefined (no expiry)\n   * @example 60 → items expire after 1 hour by default\n   */\n  defaultExpiry?: number;\n\n  /**\n   * Storage type to use\n   * @default 'local'\n   * @example 'session' → uses sessionStorage instead\n   */\n  storageType?: 'local' | 'session';\n}\n```\n\n### Configuration Examples\n\n```typescript\n// E-commerce app: prefix + default expiry\nprovideStorage({\n  prefix: 'shop_',\n  defaultExpiry: 120 // 2 hours default\n})\n\n// Multi-tenant app: different prefixes\nprovideStorage({\n  prefix: `tenant_${tenantId}_`,\n  defaultExpiry: 60\n})\n\n// Session-only app\nprovideStorage({\n  storageType: 'session',\n  defaultExpiry: 30\n})\n```\n\n---\n\n## 🛡️ SSR Safety (Angular Universal)\n\nThe service automatically handles server-side rendering:\n\n```typescript\n// On server: returns null safely, no crashes\nconst user = this.storage.get<User>('user'); // null\n\n// On browser: works normally\nconst user = this.storage.get<User>('user'); // User | null\n\n// No platform checks needed!\n// Works with Angular Universal out of the box\n```\n\n**Benefits:**\n- ✅ SEO works perfectly\n- ✅ Fast initial page load\n- ✅ No server crashes\n- ✅ Works with Vercel, Netlify, etc.\n\n---\n\n## ⚠️ Security Best Practices\n\n### ❌ NEVER Store These\n\n**This library is NOT for sensitive credentials:**\n\n- ❌ Passwords or PINs\n- ❌ Credit card numbers / CVV\n- ❌ OTP / verification codes\n- ❌ Government identity numbers\n- ❌ Bank account details\n\n### ✅ Safe to Store\n\n- ✅ Access tokens (with short expiry)\n- ✅ Refresh tokens (with longer expiry)\n- ✅ User profile data (non-sensitive)\n- ✅ UI preferences (theme, language)\n- ✅ Cart items, filters, UI state\n- ✅ Session flags\n\n### 🔐 Correct Authentication Pattern\n\n```typescript\n// ❌ WRONG - Never do this\nstorage.set('password', password, 60); // NEVER!\n\n// ✅ CORRECT - Token-based auth\nstorage.set('accessToken', token, 15); // 15 minutes\nstorage.set('refreshToken', refreshToken, 7 * 24 * 60); // 7 days\n```\n\n**Remember:** localStorage is a cache, not a secure vault.\n\n---\n\n## 📋 What Should Expire? (Data Guide)\n\n| Data Type | Example | Expiry | Why |\n|-----------|---------|--------|-----|\n| **Access Token** | JWT token | 15-60 min | Security, can be refreshed |\n| **User Profile** | Name, ID, role | 1-24 hours | Can be refetched from API |\n| **Cart Items** | Product IDs | 1-7 days | Can be rebuilt from backend |\n| **Theme** | dark/light | None | User preference, should persist |\n| **Language** | en, hi | None | User preference, should persist |\n| **Form Drafts** | Unsaved edits | None | User work, should not expire |\n\n---\n\n## 🔧 API Reference\n\n### `StorageService`\n\n#### `set<T>(key: string, value: T, expiryMinutes?: number): void`\n\nStore a value with optional expiry.\n\n```typescript\nstorage.set('user', userData, 60); // 60 minutes\nstorage.set('token', token); // Uses defaultExpiry\nstorage.set('theme', 'dark', 0); // No expiry\n```\n\n#### `get<T>(key: string): T | null`\n\nRetrieve a value. Returns `null` if not found or expired.\n\n```typescript\nconst user = storage.get<User>('user'); // User | null\n```\n\n- Automatically removes expired items\n- Type-safe with generics\n- Never throws errors\n\n#### `has(key: string): boolean`\n\nCheck if a key exists and is not expired.\n\n```typescript\nif (storage.has('token')) {\n  // Token exists and is valid\n}\n```\n\n#### `remove(key: string): void`\n\nRemove a specific key.\n\n```typescript\nstorage.remove('token');\n```\n\n#### `clear(): void`\n\nClear all storage items (respects prefix if configured).\n\n```typescript\nstorage.clear(); // Removes all items with prefix\n```\n\n#### `keys(): string[]`\n\nGet all storage keys (with prefix stripped if configured).\n\n```typescript\nconst keys = storage.keys(); // ['user', 'token', ...]\n```\n\n#### `cleanExpired(): void`\n\nManually clean all expired items.\n\n```typescript\nstorage.cleanExpired(); // Removes all expired items\n```\n\n---\n\n## 🧪 Testing\n\nEasy to mock in tests:\n\n```typescript\nimport { StorageService } from '@angular-storage-expiry/storage-expiry';\n\ndescribe('MyComponent', () => {\n  let storageService: jasmine.SpyObj<StorageService>;\n  \n  beforeEach(() => {\n    storageService = jasmine.createSpyObj('StorageService', ['get', 'set']);\n    TestBed.configureTestingModule({\n      providers: [\n        { provide: StorageService, useValue: storageService }\n      ]\n    });\n  });\n  \n  it('should load user from storage', () => {\n    storageService.get.and.returnValue({ id: 1, name: 'John' });\n    // Test your component\n  });\n});\n```\n\n---\n\n## 🔄 Migration from Raw localStorage\n\n### Before (Problems)\n\n```typescript\n// ❌ No expiry\nlocalStorage.setItem('user', JSON.stringify(user));\n\n// ❌ Manual parsing, error-prone\nconst user = JSON.parse(localStorage.getItem('user') || '{}');\n\n// ❌ No type safety\n// ❌ Crashes on SSR\n// ❌ Repeated everywhere\n```\n\n### After (Solutions)\n\n```typescript\n// ✅ Automatic expiry\nstorage.set('user', user, 60);\n\n// ✅ Safe, type-safe retrieval\nconst user = storage.get<User>('user');\n\n// ✅ Type safety\n// ✅ SSR safe\n// ✅ Centralized service\n```\n\n---\n\n## 📊 Bundle Size\n\n- **Minified**: ~2KB\n- **Gzipped**: ~1KB\n- **Zero dependencies** (only Angular core)\n- **Tree-shakeable**\n\n---\n\n## 🌟 Features\n\n- ✅ **Automatic Expiry** - TTL support with auto-cleanup\n- ✅ **SSR Safe** - Works with Angular Universal\n- ✅ **Type Safe** - Full TypeScript generics\n- ✅ **Dual Support** - NgModule & Standalone\n- ✅ **Error Handling** - Safe JSON parsing\n- ✅ **Prefix Support** - Namespace your keys\n- ✅ **Session Storage** - Optional sessionStorage support\n- ✅ **Auto Cleanup** - Expired items removed automatically\n- ✅ **Tree Shakeable** - No unused code\n\n---\n\n## 🤝 Comparison with Other Packages\n\n| Feature | This Package | ngx-webstorage | angular-2-local-storage |\n|---------|-------------|----------------|------------------------|\n| Standalone Support | ✅ | ❌ | ❌ |\n| Built-in Expiry | ✅ | ❌ | ❌ |\n| SSR Safe | ✅ | ⚠️ | ❌ |\n| Type Safety | ✅ | ⚠️ | ⚠️ |\n| Bundle Size | ✅ Small | ⚠️ Medium | ⚠️ Medium |\n| Maintenance | ✅ Active | ⚠️ Slow | ❌ Deprecated |\n\n---\n\n## 📄 License\n\nMIT\n\n---\n\n## 🙏 Contributing\n\nContributions are welcome! Please feel free to submit a Pull Request.\n\n---\n\n## 📮 Support\n\nFor issues and feature requests, please use the [GitHub Issues](https://github.com/yourusername/angular-storage-expiry/issues) page.\n\n---\n\n**Made with ❤️ for the Angular community**\n","readmeFilename":"README.md","_rev":"1-ffc6174cef887d4a8ef03e92cb89d38a"}