@alwatr/local-storage 5.5.10 → 6.0.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.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,46 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [6.0.0](https://github.com/Alwatr/nanolib/compare/@alwatr/local-storage@5.5.10...@alwatr/local-storage@6.0.0) (2025-09-13)
7
+
8
+ ### ⚠ BREAKING CHANGES
9
+
10
+ * **local-storage:** The provider's constructor config shape and public methods have changed.
11
+ Existing callers must be updated to the new API:
12
+ - Update imports/instantiation to use the new LocalStorageProvider<T>(config: LocalStorageProviderConfig<T>).
13
+ - Replace any old config fields / method names with the new ones (e.g. versioned key handling, defaultValue handling).
14
+ - Data migration behavior changed: previous-version keys are automatically removed when version > 1.
15
+ - Update call sites that relied on prior serialization, error handling, or return semantics.
16
+
17
+ Suggested migration steps:
18
+ 1. Inspect the new LocalStorageProviderConfig<T> type and adapt object literal passed to the constructor.
19
+ 2. Replace old read/write/remove calls with the new method names and signatures.
20
+ 3. Ensure stored values match the new serialization expectations (JSON-serializable).
21
+ 4. Run tests and rehydrate any persisted data if necessary (previous keys are removed for versions >1).
22
+
23
+ ### ✨ Features
24
+
25
+ * **local-storage:** add factory function to create LocalStorageProvider with detailed documentation ([eb4a04d](https://github.com/Alwatr/nanolib/commit/eb4a04de84d69497e7489b756c172ed2b0af008d))
26
+ * **local-storage:** add static method to check existence of versioned items in localStorage ([8e05938](https://github.com/Alwatr/nanolib/commit/8e059382d085aa691f296b2267a372925868f974))
27
+
28
+ ### 🐛 Bug Fixes
29
+
30
+ * **local-storage:** correct typo in writeDefault method name ([c0b05c0](https://github.com/Alwatr/nanolib/commit/c0b05c0417ec75e7d9bc57c224380f34472ec467))
31
+ * **local-storage:** simplify read method by removing type check for parsed value ([23826ef](https://github.com/Alwatr/nanolib/commit/23826ef70eb22e6f092ba2c6ce11c28b3628f2f2))
32
+ * **local-storage:** standardize key naming convention in LocalStorageProvider ([043cf27](https://github.com/Alwatr/nanolib/commit/043cf27881b840d5adeb79ea4a840a15ea23e262))
33
+
34
+ ### 🔨 Code Refactoring
35
+
36
+ * **local-storage:** complete API rewrite for LocalStorageProvider ([29d01d8](https://github.com/Alwatr/nanolib/commit/29d01d84fbb3ed405ce46d1870d1a929de1c838c))
37
+ * **local-storage:** enhance logging in read and write methods for better error tracking ([2cbf404](https://github.com/Alwatr/nanolib/commit/2cbf4042fcef74de016fd1ae80f8263f9de5c610))
38
+ * **local-storage:** rename private key variable and update its initialization method ([e25a8ea](https://github.com/Alwatr/nanolib/commit/e25a8ea4a4b75aeac0702fc0a9ef39a5f441e54c))
39
+ * **local-storage:** update key generation method to static and enhance documentation ([e36fd53](https://github.com/Alwatr/nanolib/commit/e36fd5355ad4b7fa7b4e629568b9a878ae868c3e))
40
+ * **types:** reorganize StorageMeta and LocalStorageProviderConfig interfaces ([d3d001e](https://github.com/Alwatr/nanolib/commit/d3d001ef041ea59981551204d84bee7635cfc192))
41
+
42
+ ### 🧹 Miscellaneous Chores
43
+
44
+ * add @jest/globals dependency for testing ([a024449](https://github.com/Alwatr/nanolib/commit/a024449366e6b4aa246603528dde6586dda3379e))
45
+
6
46
  ## [5.5.10](https://github.com/Alwatr/nanolib/compare/@alwatr/local-storage@5.5.9...@alwatr/local-storage@5.5.10) (2025-09-09)
7
47
 
8
48
  ### 🧹 Miscellaneous Chores
package/README.md CHANGED
@@ -1,69 +1,268 @@
1
- # localJsonStorage
1
+ # Alwatr Local Storage Provider
2
2
 
3
- `localJsonStorage` is a utility object in our TypeScript package that provides methods for interacting with the local storage in a structured and versioned manner.
3
+ A modern, simple, and robust solution for managing versioned JSON objects in the browser's `localStorage`. This package provides a clean, class-based API with a factory function to ensure your application's data persistence is safe, maintainable, and future-proof.
4
4
 
5
- ## Installation
5
+ It's designed to handle data structure migrations automatically, preventing issues when your application updates and the shape of your stored data changes.
6
+
7
+ [](https://www.google.com/search?q=https://www.npmjs.com/package/%40alwatr/local-storage)
8
+ [](https://www.google.com/search?q=https://www.npmjs.com/package/%40alwatr/nanolib)
9
+ [](https://www.google.com/search?q=alwatr+local+storage)
10
+ [](https://www.google.com/search?q=alwatr+nanolib)
11
+ [](https://www.google.com/search?q=alwatr)
12
+
13
+ ## Core Concepts
14
+
15
+ This library is built upon a few simple but powerful concepts:
16
+
17
+ 1. **Provider Pattern**: Instead of using static functions, you create an _instance_ of a `LocalStorageProvider` for each unique data item you want to manage. This instance is configured once with a name, version, and default value, and then used to interact with that specific item.
6
18
 
7
- Before you can use `localJsonStorage`, you need to install the package. If you're using npm, you can do this with:
19
+ 2. **Versioning & Automatic Migration**: When you initialize a provider with a new `version` number, it automatically removes all older versions of that data from `localStorage`. This prevents conflicts and ensures the application is working with the correct data structure.
20
+
21
+ 3. **Facade Factory Function**: The `createLocalStorageProvider` function acts as a clean entry point (Facade) to the library. This simplifies the API and decouples your code from the internal class implementation, making future library upgrades safer and easier.
22
+
23
+ 4. **Static Existence Check**: The static method `LocalStorageProvider.has()` allows you to check if data exists _before_ creating a provider instance. This is highly efficient for scenarios where you only need to know if the data is present, without needing the data itself or a default value.
24
+
25
+ ## Installation
8
26
 
9
27
  ```bash
28
+ # Using yarn
29
+ yarn add @alwatr/local-storage
30
+
31
+ # Using npm
10
32
  npm install @alwatr/local-storage
11
33
  ```
12
34
 
13
- If you're using Yarn, you can do this with:
35
+ ## API and Usage
36
+
37
+ ### 1\. Creating a Storage Provider
38
+
39
+ The recommended way to get started is by using the `createLocalStorageProvider` factory function. It encapsulates the instantiation logic and provides a clean API.
40
+
41
+ ```typescript
42
+ import {createLocalStorageProvider} from '@alwatr/local-storage';
43
+
44
+ // Define the shape of your data
45
+ interface UserSettings {
46
+ theme: 'light' | 'dark';
47
+ notifications: boolean;
48
+ lastLogin: number | null;
49
+ }
50
+
51
+ // Create a provider for user settings
52
+ const userSettingsProvider = createLocalStorageProvider<UserSettings>({
53
+ name: 'user-settings',
54
+ version: 1,
55
+ defaultValue: {
56
+ theme: 'light',
57
+ notifications: true,
58
+ lastLogin: null,
59
+ },
60
+ });
61
+ ```
62
+
63
+ ### 2\. Writing Data
64
+
65
+ Use the `.write()` method on the provider instance to save data. The value will be automatically serialized to a JSON string.
66
+
67
+ ```typescript
68
+ userSettingsProvider.write({
69
+ theme: 'dark',
70
+ notifications: false,
71
+ lastLogin: Date.now(),
72
+ });
73
+ ```
74
+
75
+ ### 3\. Reading Data
76
+
77
+ Use the `.read()` method to retrieve the data.
78
+
79
+ - If a value exists in `localStorage` and is valid JSON, it will be parsed and returned.
80
+ - If no value exists or if the stored value is corrupted (invalid JSON), the `defaultValue` will be written to `localStorage` and then returned. This guarantees you always receive a value of the correct type.
81
+
82
+ <!-- end list -->
83
+
84
+ ```typescript
85
+ const currentSettings = userSettingsProvider.read();
86
+ console.log(currentSettings.theme); // "dark"
87
+ ```
88
+
89
+ ### 4\. Checking for Data Existence (The Recommended Way)
90
+
91
+ This is a critical feature for many applications. Before rendering a component or creating a full provider instance, you might need to check if the user has already saved data. Use the static `LocalStorageProvider.has()` method for this.
92
+
93
+ This method is highly efficient as it **does not** require a `defaultValue` and does not create a class instance.
94
+
95
+ ```typescript
96
+ import {LocalStorageProvider} from '@alwatr/local-storage';
97
+
98
+ const formMeta = {name: 'user-survey-form', version: 1};
99
+
100
+ if (LocalStorageProvider.has(formMeta)) {
101
+ // The user has already filled out the form.
102
+ // Show a "Thank you" message instead of the form.
103
+ showThankYouMessage();
104
+ } else {
105
+ // No data found, so render the form.
106
+ renderSurveyForm();
107
+ }
108
+ ```
109
+
110
+ ### 5\. Removing Data
111
+
112
+ To completely remove the item from `localStorage`, use the `.remove()` method.
113
+
114
+ ```typescript
115
+ userSettingsProvider.remove();
116
+ ```
117
+
118
+ ## Best Practices
119
+
120
+ - **Always use the `createLocalStorageProvider` factory function.** It provides a stable API that protects your code from internal library changes.
121
+ - **Prefer `LocalStorageProvider.has()` for existence checks.** It's the most performant and cleanest way to check for data without the overhead of creating an instance and providing a `defaultValue`.
122
+ - **Increment the `version` number** whenever you make a breaking change to your data structure. The library will handle the cleanup of old data automatically.
123
+
124
+ ---
125
+
126
+ ## Sponsors
127
+
128
+ The following companies, organizations, and individuals support flux ongoing maintenance and development. Become a Sponsor to get your logo on our README and website.
129
+
130
+ ## Contributing
131
+
132
+ Contributions are welcome! Please read our [contribution guidelines](https://github.com/Alwatr/.github/blob/next/CONTRIBUTING.md) before submitting a pull request.
133
+
134
+ ---
135
+
136
+ <br>
137
+ <br>
138
+ <br>
139
+
140
+ # Alwatr Local Storage Provider (راهنمای فارسی)
141
+
142
+ یک راهکار مدرن، ساده و قدرتمند برای مدیریت آبجکت‌های JSON نسخه‌بندی شده در `localStorage` مرورگر. این پکیج یک API تمیز و مبتنی بر کلاس به همراه یک تابع سازنده (Factory Function) ارائه می‌دهد تا اطمینان حاصل شود که پایداری داده‌های اپلیکیشن شما امن، قابل نگهداری و آماده برای آینده است.
143
+
144
+ این کتابخانه طوری طراحی شده است که مهاجرت (migration) ساختار داده را به صورت خودکار مدیریت کند و از بروز مشکل در هنگام به‌روزرسانی اپلیکیشن و تغییر شکل داده‌های ذخیره شده جلوگیری نماید.
145
+
146
+ [](https://www.google.com/search?q=https://www.npmjs.com/package/%40alwatr/local-storage)
147
+ [](https://www.google.com/search?q=https://www.npmjs.com/package/%40alwatr/local-storage)
148
+ [](https://www.google.com/search?q=alwatr+local+storage)
149
+ [](https://www.google.com/search?q=alwatr)
150
+
151
+ ## مفاهیم اصلی
152
+
153
+ این کتابخانه بر پایه چند مفهوم ساده اما قدرتمند بنا شده است:
154
+
155
+ 1. **الگوی Provider (ارائه‌دهنده)**: به جای استفاده از توابع استاتیک، شما برای هر آیتم داده‌ای که می‌خواهید مدیریت کنید، یک _نمونه (instance)_ از `LocalStorageProvider` می‌سازید. این نمونه یک بار با `name`, `version` و `defaultValue` پیکربندی شده و سپس برای تعامل با آن آیتم خاص استفاده می‌شود.
156
+
157
+ 2. **نسخه‌بندی و مهاجرت خودکار**: هنگامی که شما یک Provider را با شماره `version` جدیدی مقداردهی اولیه می‌کنید، این کتابخانه به طور خودکار تمام نسخه‌های قدیمی‌تر آن داده را از `localStorage` حذف می‌کند. این کار از تداخل جلوگیری کرده و تضمین می‌کند که اپلیکیشن همیشه با ساختار داده صحیح کار می‌کند.
158
+
159
+ 3. **تابع سازنده Facade**: تابع `createLocalStorageProvider` به عنوان یک نقطه ورود تمیز (Facade) به کتابخانه عمل می‌کند. این کار API را ساده کرده و کد شما را از پیاده‌سازی داخلی کلاس‌ها جدا (decouple) می‌سازد، که باعث می‌شود ارتقاء کتابخانه در آینده امن‌تر و آسان‌تر باشد.
160
+
161
+ 4. **بررسی استاتیک وجود داده**: متد استاتیک `LocalStorageProvider.has()` به شما اجازه می‌دهد وجود داده را _قبل_ از ساختن یک نمونه از Provider بررسی کنید. این روش برای سناریوهایی که فقط نیاز دارید بدانید داده‌ای وجود دارد یا نه (بدون نیاز به خود داده یا مقدار پیش‌فرض) بسیار کارآمد است.
162
+
163
+ ## نصب
14
164
 
15
165
  ```bash
166
+ # با استفاده از yarn
16
167
  yarn add @alwatr/local-storage
168
+
169
+ # با استفاده از npm
170
+ npm install @alwatr/local-storage
17
171
  ```
18
172
 
19
- ## Usage
173
+ ## API و راهنمای استفاده
174
+
175
+ ### ۱. ساختن یک Storage Provider
20
176
 
21
- First, you need to import `localJsonStorage` from the package:
177
+ بهترین روش برای شروع، استفاده از تابع سازنده `createLocalStorageProvider` است. این تابع منطق ساخت نمونه را کپسوله کرده و یک API تمیز ارائه می‌دهد.
22
178
 
23
179
  ```typescript
24
- import {localJsonStorage} from '@alwatr/local-storage';
180
+ import {createLocalStorageProvider} from '@alwatr/local-storage';
181
+
182
+ // ساختار داده خود را تعریف کنید
183
+ interface UserSettings {
184
+ theme: 'light' | 'dark';
185
+ notifications: boolean;
186
+ lastLogin: number | null;
187
+ }
188
+
189
+ // یک provider برای تنظیمات کاربر بسازید
190
+ const userSettingsProvider = createLocalStorageProvider<UserSettings>({
191
+ name: 'user-settings',
192
+ version: 1,
193
+ defaultValue: {
194
+ theme: 'light',
195
+ notifications: true,
196
+ lastLogin: null,
197
+ },
198
+ });
25
199
  ```
26
200
 
27
- Or for CommonJS:
201
+ ### ۲. نوشتن داده (Write)
28
202
 
29
- ```javascript
30
- const {localJsonStorage} = require('@alwatr/local-storage');
203
+ از متد `.write()` روی نمونه Provider برای ذخیره داده استفاده کنید. مقدار داده به صورت خودکار به رشته JSON تبدیل می‌شود.
204
+
205
+ ```typescript
206
+ userSettingsProvider.write({
207
+ theme: 'dark',
208
+ notifications: false,
209
+ lastLogin: Date.now(),
210
+ });
31
211
  ```
32
212
 
33
- ### Getting an Item
213
+ ### ۳. خواندن داده (Read)
214
+
215
+ از متد `.read()` برای بازیابی داده استفاده کنید.
34
216
 
35
- You can get an item from local storage and parse it as JSON using the `getItem` method. If the item is not found, it will return a default value:
217
+ - اگر مقداری در `localStorage` وجود داشته باشد و JSON معتبر باشد، آن مقدار parse شده و برگردانده می‌شود.
218
+ - اگر مقداری وجود نداشته باشد یا مقدار ذخیره شده خراب باشد (JSON نامعتبر)، `defaultValue` در `localStorage` نوشته شده و سپس برگردانده می‌شود. این تضمین می‌کند که شما همیشه یک مقدار با نوع صحیح دریافت می‌کنید.
219
+
220
+ <!-- end list -->
36
221
 
37
222
  ```typescript
38
- const defaultValue = {a: 1, b: 2};
39
- const value = localJsonStorage.getItem('item-name', defaultValue);
223
+ const currentSettings = userSettingsProvider.read();
224
+ console.log(currentSettings.theme); // "dark"
40
225
  ```
41
226
 
42
- ### Setting an Item
227
+ ### ۴. بررسی وجود داده (روش پیشنهادی)
228
+
229
+ این یک قابلیت حیاتی برای بسیاری از اپلیکیشن‌ها است. قبل از رندر کردن یک کامپوننت یا ساختن یک نمونه کامل از Provider، ممکن است لازم باشد بررسی کنید که آیا کاربر قبلاً داده‌ای ذخیره کرده است یا خیر. برای این کار از متد استاتیک `LocalStorageProvider.has()` استفاده کنید.
43
230
 
44
- You can set an item in local storage as JSON using the `setItem` method:
231
+ این متد بسیار کارآمد است زیرا **نیازی** به `defaultValue` ندارد و یک نمونه از کلاس نمی‌سازد.
45
232
 
46
233
  ```typescript
47
- const value = {a: 1, b: 2};
48
- localJsonStorage.setItem('item-name', value);
234
+ import {LocalStorageProvider} from '@alwatr/local-storage';
235
+
236
+ const formMeta = {name: 'user-survey-form', version: 1};
237
+
238
+ if (LocalStorageProvider.has(formMeta)) {
239
+ // داده وجود دارد. کاربر قبلاً فرم را پر کرده است.
240
+ // به جای فرم، یک پیام تشکر نمایش دهید.
241
+ showThankYouMessage();
242
+ } else {
243
+ // داده‌ای یافت نشد، بنابراین فرم را نمایش دهید.
244
+ renderSurveyForm();
245
+ }
49
246
  ```
50
247
 
51
- ### Removing an Item
248
+ ### ۵. حذف داده (Remove)
52
249
 
53
- You can remove an item from local storage using the `removeItem` method:
250
+ برای حذف کامل یک آیتم از `localStorage`، از متد `.remove()` استفاده کنید.
54
251
 
55
252
  ```typescript
56
- localJsonStorage.removeItem('item-name');
253
+ userSettingsProvider.remove();
57
254
  ```
58
255
 
59
- ## Future Plans
256
+ ## بهترین روش‌ها (Best Practices)
60
257
 
61
- We plan to add more methods to `localJsonStorage` for directly interacting with local storage. Stay tuned for updates!
258
+ - **همیشه از تابع سازنده `createLocalStorageProvider` استفاده کنید.** این تابع یک API پایدار فراهم می‌کند که کد شما را در برابر تغییرات داخلی کتابخانه محافظت می‌کند.
259
+ - **برای بررسی وجود داده، `LocalStorageProvider.has()` را ترجیح دهید.** این کارآمدترین و تمیزترین روش برای بررسی وجود داده بدون سربار ساختن یک نمونه و تعریف `defaultValue` است.
260
+ - **هر زمان که یک تغییر ساختاری در داده‌های خود ایجاد کردید که با نسخه‌های قبلی ناسازگار است، شماره `version` را افزایش دهید.** کتابخانه پاک‌سازی داده‌های قدیمی را به صورت خودکار انجام خواهد داد.
62
261
 
63
- ## Sponsors
262
+ ## حامیان (Sponsors)
64
263
 
65
- The following companies, organizations, and individuals support Nanolib ongoing maintenance and development. Become a Sponsor to get your logo on our README and website.
264
+ شرکت‌ها، سازمان‌ها و افراد زیر از نگهداری و توسعه مداوم flux حمایت می‌کنند. با تبدیل شدن به یک حامی، لوگوی خود را در README و وب‌سایت ما قرار دهید.
66
265
 
67
- ### Contributing
266
+ ## مشارکت (Contributing)
68
267
 
69
- Contributions are welcome! Please read our [contribution guidelines](https://github.com/Alwatr/.github/blob/next/CONTRIBUTING.md) before submitting a pull request.
268
+ از مشارکت‌ها استقبال می‌شود! لطفاً قبل از ارسال pull request، [راهنمای مشارکت ما](https://github.com/Alwatr/.github/blob/next/CONTRIBUTING.md) را مطالعه کنید.
@@ -0,0 +1,74 @@
1
+ import type { LocalStorageProviderConfig, StorageMeta } from './type.js';
2
+ /**
3
+ * A provider class for managing a specific, versioned item in localStorage.
4
+ * It encapsulates the logic for key generation, serialization, and migration.
5
+ *
6
+ * @example
7
+ * ```typescript
8
+ * const userSettings = new LocalStorageProvider({
9
+ * name: 'user-settings',
10
+ * version: 1,
11
+ * defaultValue: { theme: 'light', notifications: true }
12
+ * });
13
+ *
14
+ * // Write new settings
15
+ * userSettings.write({ theme: 'dark', notifications: false });
16
+ *
17
+ * // Read the current settings
18
+ * const currentSettings = userSettings.read();
19
+ * console.log(currentSettings); // { theme: 'dark', notifications: false }
20
+ * ```
21
+ */
22
+ export declare class LocalStorageProvider<T extends JsonValue> {
23
+ protected readonly config_: LocalStorageProviderConfig<T>;
24
+ private readonly key__;
25
+ protected readonly logger_: import("@alwatr/logger").AlwatrLogger;
26
+ constructor(config_: LocalStorageProviderConfig<T>);
27
+ /**
28
+ * Generates the versioned storage key.
29
+ * @param meta - An object containing the name and version.
30
+ * @returns The versioned key string.
31
+ */
32
+ static getKey(meta: StorageMeta): string;
33
+ /**
34
+ * Statically checks if a versioned item exists in localStorage.
35
+ * This method provides a high-performance way to check for data existence without the overhead of creating a full provider instance.
36
+ *
37
+ * @param meta - An object containing the name and version of the item to check.
38
+ * @returns `true` if the item exists, otherwise `false`.
39
+ *
40
+ * @example
41
+ * ```typescript
42
+ * const formExists = LocalStorageProvider.has({ name: 'user-form', version: 1 });
43
+ * if (formExists) {
44
+ * // Show the "Thank you" message
45
+ * } else {
46
+ * // Show the form
47
+ * }
48
+ * ```
49
+ */
50
+ static has(meta: StorageMeta): boolean;
51
+ /**
52
+ * Writes the default value to localStorage and returns it.
53
+ */
54
+ private writeDefault__;
55
+ /**
56
+ * Reads and parses the value from localStorage.
57
+ * If the item doesn't exist, is invalid JSON, or doesn't match the expected type,
58
+ * it writes and returns the default value.
59
+ */
60
+ read(): T;
61
+ /**
62
+ * Serializes and writes a value to localStorage.
63
+ */
64
+ write(value: T): void;
65
+ /**
66
+ * Removes the item from localStorage.
67
+ */
68
+ remove(): void;
69
+ /**
70
+ * Manages data migration by removing all previous versions of the item.
71
+ */
72
+ private migrate__;
73
+ }
74
+ //# sourceMappingURL=local-storage.provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-storage.provider.d.ts","sourceRoot":"","sources":["../src/local-storage.provider.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAC,0BAA0B,EAAE,WAAW,EAAC,MAAM,WAAW,CAAC;AAIvE;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,oBAAoB,CAAC,CAAC,SAAS,SAAS;IAIhC,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,0BAA0B,CAAC,CAAC,CAAC;IAH5E,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,SAAS,CAAC,QAAQ,CAAC,OAAO,wCAA4F;gBAEhF,OAAO,EAAE,0BAA0B,CAAC,CAAC,CAAC;IAM5E;;;;OAIG;WACW,MAAM,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM;IAI/C;;;;;;;;;;;;;;;;OAgBG;WACW,GAAG,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO;IAK7C;;OAEG;IACH,OAAO,CAAC,cAAc;IAMtB;;;;OAIG;IACI,IAAI,IAAI,CAAC;IAmBhB;;OAEG;IACI,KAAK,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI;IAU5B;;OAEG;IACI,MAAM,IAAI,IAAI;IAIrB;;OAEG;IACH,OAAO,CAAC,SAAS;CASlB"}
package/dist/main.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /* @alwatr/local-storage v5.5.10 */
1
+ /* @alwatr/local-storage v6.0.0 */
2
2
  "use strict";
3
3
  var __defProp = Object.defineProperty;
4
4
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
@@ -21,113 +21,116 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
21
21
  // src/main.ts
22
22
  var main_exports = {};
23
23
  __export(main_exports, {
24
- localJsonStorage: () => localJsonStorage
24
+ LocalStorageProvider: () => LocalStorageProvider,
25
+ createLocalStorageProvider: () => createLocalStorageProvider
25
26
  });
26
27
  module.exports = __toCommonJS(main_exports);
28
+
29
+ // src/local-storage.provider.ts
30
+ var import_logger = require("@alwatr/logger");
27
31
  var import_package_tracer = require("@alwatr/package-tracer");
28
- __dev_mode__: import_package_tracer.packageTracer.add("@alwatr/local-storage", "5.5.10");
29
- function parseJson(content) {
30
- try {
31
- return JSON.parse(content);
32
- } catch (err) {
33
- console.error("parseJson", "invalid_json", err);
34
- return null;
32
+ __dev_mode__: import_package_tracer.packageTracer.add("@alwatr/local-storage", "6.0.0");
33
+ var LocalStorageProvider = class _LocalStorageProvider {
34
+ constructor(config_) {
35
+ this.config_ = config_;
36
+ this.logger_ = (0, import_logger.createLogger)(`local-storage-provider: ${this.config_.name}, v: ${this.config_.version}`);
37
+ this.logger_.logMethodArgs?.("constructor", { config: this.config_ });
38
+ this.key__ = _LocalStorageProvider.getKey(this.config_);
39
+ this.migrate__();
35
40
  }
36
- }
37
- var localJsonStorage = {
38
41
  /**
39
- * Generate local storage key.
40
- *
41
- * @param name - Name of the item.
42
- * @param version - Version of the item (default: 1).
43
- * @returns The generated local storage key.
44
- * @example
45
- * ```typescript
46
- * localJsonStorage.key_('myItem', 1); // myItem.v1
47
- * ```
42
+ * Generates the versioned storage key.
43
+ * @param meta - An object containing the name and version.
44
+ * @returns The versioned key string.
48
45
  */
49
- key_(name, version = 1) {
50
- return `${name}.v${version}`;
51
- },
46
+ static getKey(meta) {
47
+ return `${meta.name}.v${meta.version}`;
48
+ }
52
49
  /**
53
- * Get the local storage item and parse it as JSON.
54
- * If the item is not found, return the default value.
55
- * If the version is greater than 1, remove the previous version.
56
- * If the item is not a valid JSON object, return the default value.
50
+ * Statically checks if a versioned item exists in localStorage.
51
+ * This method provides a high-performance way to check for data existence without the overhead of creating a full provider instance.
52
+ *
53
+ * @param meta - An object containing the name and version of the item to check.
54
+ * @returns `true` if the item exists, otherwise `false`.
57
55
  *
58
- * @param name - The name of the item.
59
- * @param defaultValue - The default value of the item.
60
- * @param version - The data structure version of the item (default: 1).
61
- * @returns The parsed JSON value or the default value if the item is not found.
62
56
  * @example
63
57
  * ```typescript
64
- * const value = localJsonStorage.getItem('myItem', {a: 1, b: 2});
58
+ * const formExists = LocalStorageProvider.has({ name: 'user-form', version: 1 });
59
+ * if (formExists) {
60
+ * // Show the "Thank you" message
61
+ * } else {
62
+ * // Show the form
63
+ * }
65
64
  * ```
66
65
  */
67
- getItem(name, defaultValue, version = 1) {
68
- if (version > 1) {
69
- this.removeItem(name, version - 1);
70
- }
71
- if (version > 1) {
72
- this.removeItem(name, version - 1);
73
- }
74
- const key = this.key_(name, version);
75
- const value = localStorage.getItem(key);
76
- if (value === null) {
77
- localStorage.setItem(key, JSON.stringify(defaultValue));
78
- return defaultValue;
66
+ static has(meta) {
67
+ const key = _LocalStorageProvider.getKey(meta);
68
+ return localStorage.getItem(key) !== null;
69
+ }
70
+ /**
71
+ * Writes the default value to localStorage and returns it.
72
+ */
73
+ writeDefault__() {
74
+ this.logger_.logMethodArgs?.("writeDefaultــ", this.config_.defaultValue);
75
+ this.write(this.config_.defaultValue);
76
+ return this.config_.defaultValue;
77
+ }
78
+ /**
79
+ * Reads and parses the value from localStorage.
80
+ * If the item doesn't exist, is invalid JSON, or doesn't match the expected type,
81
+ * it writes and returns the default value.
82
+ */
83
+ read() {
84
+ try {
85
+ const value = localStorage.getItem(this.key__);
86
+ if (value === null) {
87
+ this.logger_.logMethod?.("read//no_value");
88
+ return this.writeDefault__();
89
+ }
90
+ const parsedValue = JSON.parse(value);
91
+ this.logger_.logMethodFull?.("read//value", void 0, { parsedValue });
92
+ return parsedValue;
93
+ } catch (err) {
94
+ this.logger_.error("read", "read_parse_error", { err });
95
+ return this.writeDefault__();
79
96
  }
80
- const json = parseJson(value);
81
- if (json === null) return defaultValue;
82
- return json;
83
- },
97
+ }
84
98
  /**
85
- * Check if an item exists in local storage.
86
- *
87
- * @param name - The name of the item.
88
- * @param version - The version of the item (default: 1).
89
- * @returns True if the item exists, false otherwise.
90
- * @example
91
- * ```typescript
92
- * const exists = localJsonStorage.hasItem('myItem');
93
- * ```
99
+ * Serializes and writes a value to localStorage.
94
100
  */
95
- hasItem(name, version = 1) {
96
- const key = this.key_(name, version);
97
- return localStorage.getItem(key) !== null;
98
- },
101
+ write(value) {
102
+ this.logger_.logMethodArgs?.("write", { value });
103
+ try {
104
+ localStorage.setItem(this.key__, JSON.stringify(value));
105
+ } catch (err) {
106
+ this.logger_.error("write", "write_stringify_error", { err });
107
+ }
108
+ }
99
109
  /**
100
- * Set local storage item as JSON.
101
- *
102
- * @param name - Name of the item.
103
- * @param value - Value of the item.
104
- * @param version - Version of the item.
105
- * @example
106
- * ```typescript
107
- * localJsonStorage.setItem('myItem', {a: 1, b: 2});
108
- * ```
110
+ * Removes the item from localStorage.
109
111
  */
110
- setItem(name, value, version = 1) {
111
- const key = this.key_(name, version);
112
- localStorage.setItem(key, JSON.stringify(value));
113
- },
112
+ remove() {
113
+ localStorage.removeItem(this.key__);
114
+ }
114
115
  /**
115
- * Removes an item from the local storage.
116
- *
117
- * @param name - The name of the item to remove.
118
- * @param version - The version of the item to remove. Default is 1.
119
- * @example
120
- * ```typescript
121
- * localJsonStorage.removeItem('myItem');
122
- * ```
116
+ * Manages data migration by removing all previous versions of the item.
123
117
  */
124
- removeItem(name, version = 1) {
125
- const key = this.key_(name, version);
126
- localStorage.removeItem(key);
118
+ migrate__() {
119
+ if (this.config_.version <= 1) return;
120
+ for (let i = 1; i < this.config_.version; i++) {
121
+ const oldKey = _LocalStorageProvider.getKey({ name: this.config_.name, version: i });
122
+ localStorage.removeItem(oldKey);
123
+ }
127
124
  }
128
125
  };
126
+
127
+ // src/main.ts
128
+ function createLocalStorageProvider(config) {
129
+ return new LocalStorageProvider(config);
130
+ }
129
131
  // Annotate the CommonJS export names for ESM import in node:
130
132
  0 && (module.exports = {
131
- localJsonStorage
133
+ LocalStorageProvider,
134
+ createLocalStorageProvider
132
135
  });
133
136
  //# sourceMappingURL=main.cjs.map