@alwatr/local-storage 6.1.1 → 6.1.3
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 +11 -0
- package/README.md +3 -1
- package/dist/main.cjs +2 -136
- package/dist/main.cjs.map +1 -1
- package/dist/main.mjs +2 -109
- package/dist/main.mjs.map +1 -1
- package/dist/type.d.ts.map +1 -1
- package/package.json +13 -13
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,17 @@
|
|
|
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.1.3](https://github.com/Alwatr/nanolib/compare/@alwatr/local-storage@6.1.2...@alwatr/local-storage@6.1.3) (2025-09-15)
|
|
7
|
+
|
|
8
|
+
**Note:** Version bump only for package @alwatr/local-storage
|
|
9
|
+
|
|
10
|
+
## [6.1.2](https://github.com/Alwatr/nanolib/compare/@alwatr/local-storage@6.1.1...@alwatr/local-storage@6.1.2) (2025-09-14)
|
|
11
|
+
|
|
12
|
+
### 🔨 Code Refactoring
|
|
13
|
+
|
|
14
|
+
* **package:** update keywords in package.json for debounce, local-storage, and synapse packages ([09c9cca](https://github.com/Alwatr/nanolib/commit/09c9cca3cd600e9ffaf600fb1926c0ee884a1aa8))
|
|
15
|
+
* remove types from tsconfig.json and adjust imports in type.ts ([ad2d3b3](https://github.com/Alwatr/nanolib/commit/ad2d3b3927db7bf3b5b54dcac5cdae751d00eb4a))
|
|
16
|
+
|
|
6
17
|
## [6.1.1](https://github.com/Alwatr/nanolib/compare/@alwatr/local-storage@6.1.0...@alwatr/local-storage@6.1.1) (2025-09-13)
|
|
7
18
|
|
|
8
19
|
### 🐛 Bug Fixes
|
package/README.md
CHANGED
|
@@ -135,7 +135,7 @@ Contributions are welcome! Please read our [contribution guidelines](https://git
|
|
|
135
135
|
|
|
136
136
|
<br>
|
|
137
137
|
<br>
|
|
138
|
-
<
|
|
138
|
+
<div dir="rtl">
|
|
139
139
|
|
|
140
140
|
# Alwatr Local Storage Provider (راهنمای فارسی)
|
|
141
141
|
|
|
@@ -266,3 +266,5 @@ userSettingsProvider.remove();
|
|
|
266
266
|
## مشارکت (Contributing)
|
|
267
267
|
|
|
268
268
|
از مشارکتها استقبال میشود! لطفاً قبل از ارسال pull request، [راهنمای مشارکت ما](https://github.com/Alwatr/.github/blob/next/CONTRIBUTING.md) را مطالعه کنید.
|
|
269
|
+
|
|
270
|
+
</div>
|
package/dist/main.cjs
CHANGED
|
@@ -1,137 +1,3 @@
|
|
|
1
|
-
/* @alwatr/local-storage v6.1.
|
|
2
|
-
"use strict";
|
|
3
|
-
var __defProp = Object.defineProperty;
|
|
4
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
-
var __export = (target, all) => {
|
|
8
|
-
for (var name in all)
|
|
9
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
-
};
|
|
11
|
-
var __copyProps = (to, from, except, desc) => {
|
|
12
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
-
for (let key of __getOwnPropNames(from))
|
|
14
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
-
}
|
|
17
|
-
return to;
|
|
18
|
-
};
|
|
19
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
20
|
-
|
|
21
|
-
// src/main.ts
|
|
22
|
-
var main_exports = {};
|
|
23
|
-
__export(main_exports, {
|
|
24
|
-
LocalStorageProvider: () => LocalStorageProvider,
|
|
25
|
-
createLocalStorageProvider: () => createLocalStorageProvider
|
|
26
|
-
});
|
|
27
|
-
module.exports = __toCommonJS(main_exports);
|
|
28
|
-
|
|
29
|
-
// src/local-storage.provider.ts
|
|
30
|
-
var import_logger = require("@alwatr/logger");
|
|
31
|
-
var LocalStorageProvider = class _LocalStorageProvider {
|
|
32
|
-
constructor(config_) {
|
|
33
|
-
this.config_ = config_;
|
|
34
|
-
this.logger_ = (0, import_logger.createLogger)(`local-storage-provider: ${this.config_.name}, v: ${this.config_.version}`);
|
|
35
|
-
this.logger_.logMethodArgs?.("constructor", { config: this.config_ });
|
|
36
|
-
this.key__ = _LocalStorageProvider.getKey(this.config_);
|
|
37
|
-
this.migrate__();
|
|
38
|
-
}
|
|
39
|
-
static {
|
|
40
|
-
this.version = "6.1.1";
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Generates the versioned storage key.
|
|
44
|
-
* @param meta - An object containing the name and version.
|
|
45
|
-
* @returns The versioned key string.
|
|
46
|
-
*/
|
|
47
|
-
static getKey(meta) {
|
|
48
|
-
return `${meta.name}.v${meta.version}`;
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* Statically checks if a versioned item exists in localStorage.
|
|
52
|
-
* This method provides a high-performance way to check for data existence without the overhead of creating a full provider instance.
|
|
53
|
-
*
|
|
54
|
-
* @param meta - An object containing the name and version of the item to check.
|
|
55
|
-
* @returns `true` if the item exists, otherwise `false`.
|
|
56
|
-
*
|
|
57
|
-
* @example
|
|
58
|
-
* ```typescript
|
|
59
|
-
* const formExists = LocalStorageProvider.has({ name: 'user-form', version: 1 });
|
|
60
|
-
* if (formExists) {
|
|
61
|
-
* // Show the "Thank you" message
|
|
62
|
-
* } else {
|
|
63
|
-
* // Show the form
|
|
64
|
-
* }
|
|
65
|
-
* ```
|
|
66
|
-
*/
|
|
67
|
-
static has(meta) {
|
|
68
|
-
const key = _LocalStorageProvider.getKey(meta);
|
|
69
|
-
return localStorage.getItem(key) !== null;
|
|
70
|
-
}
|
|
71
|
-
/**
|
|
72
|
-
* Writes the default value to localStorage and returns it.
|
|
73
|
-
*/
|
|
74
|
-
writeDefault__() {
|
|
75
|
-
this.logger_.logMethodArgs?.("writeDefaultــ", this.config_.defaultValue);
|
|
76
|
-
this.write(this.config_.defaultValue);
|
|
77
|
-
return this.config_.defaultValue;
|
|
78
|
-
}
|
|
79
|
-
/**
|
|
80
|
-
* Reads and parses the value from localStorage.
|
|
81
|
-
* If the item doesn't exist, is invalid JSON, or doesn't match the expected type,
|
|
82
|
-
* it writes and returns the default value.
|
|
83
|
-
*/
|
|
84
|
-
read() {
|
|
85
|
-
try {
|
|
86
|
-
const value = localStorage.getItem(this.key__);
|
|
87
|
-
if (value === null) {
|
|
88
|
-
this.logger_.logMethod?.("read//no_value");
|
|
89
|
-
return this.writeDefault__();
|
|
90
|
-
}
|
|
91
|
-
const parsedValue = JSON.parse(value);
|
|
92
|
-
this.logger_.logMethodFull?.("read//value", void 0, { parsedValue });
|
|
93
|
-
return parsedValue;
|
|
94
|
-
} catch (err) {
|
|
95
|
-
this.logger_.error("read", "read_parse_error", { err });
|
|
96
|
-
return this.writeDefault__();
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* Serializes and writes a value to localStorage.
|
|
101
|
-
*/
|
|
102
|
-
write(value) {
|
|
103
|
-
this.logger_.logMethodArgs?.("write", { value });
|
|
104
|
-
try {
|
|
105
|
-
localStorage.setItem(this.key__, JSON.stringify(value));
|
|
106
|
-
} catch (err) {
|
|
107
|
-
this.logger_.error("write", "write_stringify_error", { err });
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
/**
|
|
111
|
-
* Removes the item from localStorage.
|
|
112
|
-
*/
|
|
113
|
-
remove() {
|
|
114
|
-
localStorage.removeItem(this.key__);
|
|
115
|
-
}
|
|
116
|
-
/**
|
|
117
|
-
* Manages data migration by removing all previous versions of the item.
|
|
118
|
-
*/
|
|
119
|
-
migrate__() {
|
|
120
|
-
if (this.config_.version <= 1) return;
|
|
121
|
-
for (let i = 1; i < this.config_.version; i++) {
|
|
122
|
-
const oldKey = _LocalStorageProvider.getKey({ name: this.config_.name, version: i });
|
|
123
|
-
localStorage.removeItem(oldKey);
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
};
|
|
127
|
-
|
|
128
|
-
// src/main.ts
|
|
129
|
-
function createLocalStorageProvider(config) {
|
|
130
|
-
return new LocalStorageProvider(config);
|
|
131
|
-
}
|
|
132
|
-
// Annotate the CommonJS export names for ESM import in node:
|
|
133
|
-
0 && (module.exports = {
|
|
134
|
-
LocalStorageProvider,
|
|
135
|
-
createLocalStorageProvider
|
|
136
|
-
});
|
|
1
|
+
/* @alwatr/local-storage v6.1.3 */
|
|
2
|
+
"use strict";var __defProp=Object.defineProperty;var __getOwnPropDesc=Object.getOwnPropertyDescriptor;var __getOwnPropNames=Object.getOwnPropertyNames;var __hasOwnProp=Object.prototype.hasOwnProperty;var __export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:true})};var __copyProps=(to,from,except,desc)=>{if(from&&typeof from==="object"||typeof from==="function"){for(let key of __getOwnPropNames(from))if(!__hasOwnProp.call(to,key)&&key!==except)__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable})}return to};var __toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:true}),mod);var main_exports={};__export(main_exports,{LocalStorageProvider:()=>LocalStorageProvider,createLocalStorageProvider:()=>createLocalStorageProvider});module.exports=__toCommonJS(main_exports);var import_logger=require("@alwatr/logger");var LocalStorageProvider=class _LocalStorageProvider{constructor(config_){this.config_=config_;this.logger_=(0,import_logger.createLogger)(`local-storage-provider: ${this.config_.name}, v: ${this.config_.version}`);this.logger_.logMethodArgs?.("constructor",{config:this.config_});this.key__=_LocalStorageProvider.getKey(this.config_);this.migrate__()}static{this.version="6.1.3"}static getKey(meta){return`${meta.name}.v${meta.version}`}static has(meta){const key=_LocalStorageProvider.getKey(meta);return localStorage.getItem(key)!==null}writeDefault__(){this.logger_.logMethodArgs?.("writeDefaultــ",this.config_.defaultValue);this.write(this.config_.defaultValue);return this.config_.defaultValue}read(){try{const value=localStorage.getItem(this.key__);if(value===null){this.logger_.logMethod?.("read//no_value");return this.writeDefault__()}const parsedValue=JSON.parse(value);this.logger_.logMethodFull?.("read//value",void 0,{parsedValue});return parsedValue}catch(err){this.logger_.error("read","read_parse_error",{err});return this.writeDefault__()}}write(value){this.logger_.logMethodArgs?.("write",{value});try{localStorage.setItem(this.key__,JSON.stringify(value))}catch(err){this.logger_.error("write","write_stringify_error",{err})}}remove(){localStorage.removeItem(this.key__)}migrate__(){if(this.config_.version<=1)return;for(let i=1;i<this.config_.version;i++){const oldKey=_LocalStorageProvider.getKey({name:this.config_.name,version:i});localStorage.removeItem(oldKey)}}};function createLocalStorageProvider(config){return new LocalStorageProvider(config)}0&&(module.exports={LocalStorageProvider,createLocalStorageProvider});
|
|
137
3
|
//# sourceMappingURL=main.cjs.map
|
package/dist/main.cjs.map
CHANGED
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/main.ts", "../src/local-storage.provider.ts"],
|
|
4
4
|
"sourcesContent": ["import {LocalStorageProvider} from './local-storage.provider.js';\n\nimport type {LocalStorageProviderConfig} from './type.js';\n\nexport * from './local-storage.provider.js';\nexport type * from './type.js';\n\n/**\n * Factory function to create a new LocalStorageProvider.\n *\n * @param config - The configuration for the provider.\n * @returns An instance of LocalStorageProvider.\n *\n * @example\n * ```typescript\n * const userSettings = createLocalStorageProvider({\n * name: 'user-settings',\n * version: 1,\n * defaultValue: { theme: 'light', notifications: true }\n * });\n *\n * // Write new settings\n * userSettings.write({ theme: 'dark', notifications: false });\n *\n * // Read the current settings\n * const currentSettings = userSettings.read();\n * console.log(currentSettings); // { theme: 'dark', notifications: false }\n * ```\n */\nexport function createLocalStorageProvider<T extends JsonValue>(config: LocalStorageProviderConfig<T>): LocalStorageProvider<T> {\n return new LocalStorageProvider<T>(config);\n}\n", "import {createLogger} from '@alwatr/logger';\n\nimport type {LocalStorageProviderConfig, StorageMeta} from './type.js';\n\n/**\n * A provider class for managing a specific, versioned item in localStorage.\n * It encapsulates the logic for key generation, serialization, and migration.\n *\n * @example\n * ```typescript\n * const userSettings = new LocalStorageProvider({\n * name: 'user-settings',\n * version: 1,\n * defaultValue: { theme: 'light', notifications: true }\n * });\n *\n * // Write new settings\n * userSettings.write({ theme: 'dark', notifications: false });\n *\n * // Read the current settings\n * const currentSettings = userSettings.read();\n * console.log(currentSettings); // { theme: 'dark', notifications: false }\n * ```\n */\nexport class LocalStorageProvider<T extends JsonValue> {\n public static readonly version = __package_version__;\n\n private readonly key__: string;\n protected readonly logger_ = createLogger(`local-storage-provider: ${this.config_.name}, v: ${this.config_.version}`);\n\n public constructor(protected readonly config_: LocalStorageProviderConfig<T>) {\n this.logger_.logMethodArgs?.('constructor', {config: this.config_});\n this.key__ = LocalStorageProvider.getKey(this.config_);\n this.migrate__();\n }\n\n /**\n * Generates the versioned storage key.\n * @param meta - An object containing the name and version.\n * @returns The versioned key string.\n */\n public static getKey(meta: StorageMeta): string {\n return `${meta.name}.v${meta.version}`;\n }\n\n /**\n * Statically checks if a versioned item exists in localStorage.\n * This method provides a high-performance way to check for data existence without the overhead of creating a full provider instance.\n *\n * @param meta - An object containing the name and version of the item to check.\n * @returns `true` if the item exists, otherwise `false`.\n *\n * @example\n * ```typescript\n * const formExists = LocalStorageProvider.has({ name: 'user-form', version: 1 });\n * if (formExists) {\n * // Show the \"Thank you\" message\n * } else {\n * // Show the form\n * }\n * ```\n */\n public static has(meta: StorageMeta): boolean {\n const key = LocalStorageProvider.getKey(meta);\n return localStorage.getItem(key) !== null;\n }\n\n /**\n * Writes the default value to localStorage and returns it.\n */\n private writeDefault__(): T {\n this.logger_.logMethodArgs?.('writeDefaultــ', this.config_.defaultValue);\n this.write(this.config_.defaultValue);\n return this.config_.defaultValue;\n }\n\n /**\n * Reads and parses the value from localStorage.\n * If the item doesn't exist, is invalid JSON, or doesn't match the expected type,\n * it writes and returns the default value.\n */\n public read(): T {\n try {\n const value = localStorage.getItem(this.key__);\n\n if (value === null) {\n this.logger_.logMethod?.('read//no_value');\n return this.writeDefault__();\n }\n\n const parsedValue = JSON.parse(value) as T;\n this.logger_.logMethodFull?.('read//value', undefined, {parsedValue});\n return parsedValue;\n }\n catch (err) {\n this.logger_.error('read', 'read_parse_error', {err});\n return this.writeDefault__();\n }\n }\n\n /**\n * Serializes and writes a value to localStorage.\n */\n public write(value: T): void {\n this.logger_.logMethodArgs?.('write', {value});\n try {\n localStorage.setItem(this.key__, JSON.stringify(value));\n }\n catch (err) {\n this.logger_.error('write', 'write_stringify_error', {err});\n }\n }\n\n /**\n * Removes the item from localStorage.\n */\n public remove(): void {\n localStorage.removeItem(this.key__);\n }\n\n /**\n * Manages data migration by removing all previous versions of the item.\n */\n private migrate__(): void {\n if (this.config_.version <= 1) return;\n\n // Iterate from v1 up to the version just before the current one and remove them.\n for (let i = 1; i < this.config_.version; i++) {\n const oldKey = LocalStorageProvider.getKey({name: this.config_.name, version: i});\n localStorage.removeItem(oldKey);\n }\n }\n}\n"],
|
|
5
|
-
"mappings": "
|
|
5
|
+
"mappings": ";qqBAAA,+LCAA,kBAA2B,0BAwBpB,IAAM,qBAAN,MAAM,qBAA0C,CAM9C,YAA+B,QAAwC,CAAxC,qBAFtC,KAAmB,WAAU,4BAAa,2BAA2B,KAAK,QAAQ,IAAI,QAAQ,KAAK,QAAQ,OAAO,EAAE,EAGlH,KAAK,QAAQ,gBAAgB,cAAe,CAAC,OAAQ,KAAK,OAAO,CAAC,EAClE,KAAK,MAAQ,sBAAqB,OAAO,KAAK,OAAO,EACrD,KAAK,UAAU,CACjB,CATA,YAAuB,QAAU,QAgBjC,OAAc,OAAO,KAA2B,CAC9C,MAAO,GAAG,KAAK,IAAI,KAAK,KAAK,OAAO,EACtC,CAmBA,OAAc,IAAI,KAA4B,CAC5C,MAAM,IAAM,sBAAqB,OAAO,IAAI,EAC5C,OAAO,aAAa,QAAQ,GAAG,IAAM,IACvC,CAKQ,gBAAoB,CAC1B,KAAK,QAAQ,gBAAgB,iBAAkB,KAAK,QAAQ,YAAY,EACxE,KAAK,MAAM,KAAK,QAAQ,YAAY,EACpC,OAAO,KAAK,QAAQ,YACtB,CAOO,MAAU,CACf,GAAI,CACF,MAAM,MAAQ,aAAa,QAAQ,KAAK,KAAK,EAE7C,GAAI,QAAU,KAAM,CAClB,KAAK,QAAQ,YAAY,gBAAgB,EACzC,OAAO,KAAK,eAAe,CAC7B,CAEA,MAAM,YAAc,KAAK,MAAM,KAAK,EACpC,KAAK,QAAQ,gBAAgB,cAAe,OAAW,CAAC,WAAW,CAAC,EACpE,OAAO,WACT,OACO,IAAK,CACV,KAAK,QAAQ,MAAM,OAAQ,mBAAoB,CAAC,GAAG,CAAC,EACpD,OAAO,KAAK,eAAe,CAC7B,CACF,CAKO,MAAM,MAAgB,CAC3B,KAAK,QAAQ,gBAAgB,QAAS,CAAC,KAAK,CAAC,EAC7C,GAAI,CACF,aAAa,QAAQ,KAAK,MAAO,KAAK,UAAU,KAAK,CAAC,CACxD,OACO,IAAK,CACV,KAAK,QAAQ,MAAM,QAAS,wBAAyB,CAAC,GAAG,CAAC,CAC5D,CACF,CAKO,QAAe,CACpB,aAAa,WAAW,KAAK,KAAK,CACpC,CAKQ,WAAkB,CACxB,GAAI,KAAK,QAAQ,SAAW,EAAG,OAG/B,QAAS,EAAI,EAAG,EAAI,KAAK,QAAQ,QAAS,IAAK,CAC7C,MAAM,OAAS,sBAAqB,OAAO,CAAC,KAAM,KAAK,QAAQ,KAAM,QAAS,CAAC,CAAC,EAChF,aAAa,WAAW,MAAM,CAChC,CACF,CACF,EDvGO,SAAS,2BAAgD,OAAgE,CAC9H,OAAO,IAAI,qBAAwB,MAAM,CAC3C",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/main.mjs
CHANGED
|
@@ -1,110 +1,3 @@
|
|
|
1
|
-
/* @alwatr/local-storage v6.1.
|
|
2
|
-
|
|
3
|
-
// src/local-storage.provider.ts
|
|
4
|
-
import { createLogger } from "@alwatr/logger";
|
|
5
|
-
var LocalStorageProvider = class _LocalStorageProvider {
|
|
6
|
-
constructor(config_) {
|
|
7
|
-
this.config_ = config_;
|
|
8
|
-
this.logger_ = createLogger(`local-storage-provider: ${this.config_.name}, v: ${this.config_.version}`);
|
|
9
|
-
this.logger_.logMethodArgs?.("constructor", { config: this.config_ });
|
|
10
|
-
this.key__ = _LocalStorageProvider.getKey(this.config_);
|
|
11
|
-
this.migrate__();
|
|
12
|
-
}
|
|
13
|
-
static {
|
|
14
|
-
this.version = "6.1.1";
|
|
15
|
-
}
|
|
16
|
-
/**
|
|
17
|
-
* Generates the versioned storage key.
|
|
18
|
-
* @param meta - An object containing the name and version.
|
|
19
|
-
* @returns The versioned key string.
|
|
20
|
-
*/
|
|
21
|
-
static getKey(meta) {
|
|
22
|
-
return `${meta.name}.v${meta.version}`;
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Statically checks if a versioned item exists in localStorage.
|
|
26
|
-
* This method provides a high-performance way to check for data existence without the overhead of creating a full provider instance.
|
|
27
|
-
*
|
|
28
|
-
* @param meta - An object containing the name and version of the item to check.
|
|
29
|
-
* @returns `true` if the item exists, otherwise `false`.
|
|
30
|
-
*
|
|
31
|
-
* @example
|
|
32
|
-
* ```typescript
|
|
33
|
-
* const formExists = LocalStorageProvider.has({ name: 'user-form', version: 1 });
|
|
34
|
-
* if (formExists) {
|
|
35
|
-
* // Show the "Thank you" message
|
|
36
|
-
* } else {
|
|
37
|
-
* // Show the form
|
|
38
|
-
* }
|
|
39
|
-
* ```
|
|
40
|
-
*/
|
|
41
|
-
static has(meta) {
|
|
42
|
-
const key = _LocalStorageProvider.getKey(meta);
|
|
43
|
-
return localStorage.getItem(key) !== null;
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* Writes the default value to localStorage and returns it.
|
|
47
|
-
*/
|
|
48
|
-
writeDefault__() {
|
|
49
|
-
this.logger_.logMethodArgs?.("writeDefaultــ", this.config_.defaultValue);
|
|
50
|
-
this.write(this.config_.defaultValue);
|
|
51
|
-
return this.config_.defaultValue;
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* Reads and parses the value from localStorage.
|
|
55
|
-
* If the item doesn't exist, is invalid JSON, or doesn't match the expected type,
|
|
56
|
-
* it writes and returns the default value.
|
|
57
|
-
*/
|
|
58
|
-
read() {
|
|
59
|
-
try {
|
|
60
|
-
const value = localStorage.getItem(this.key__);
|
|
61
|
-
if (value === null) {
|
|
62
|
-
this.logger_.logMethod?.("read//no_value");
|
|
63
|
-
return this.writeDefault__();
|
|
64
|
-
}
|
|
65
|
-
const parsedValue = JSON.parse(value);
|
|
66
|
-
this.logger_.logMethodFull?.("read//value", void 0, { parsedValue });
|
|
67
|
-
return parsedValue;
|
|
68
|
-
} catch (err) {
|
|
69
|
-
this.logger_.error("read", "read_parse_error", { err });
|
|
70
|
-
return this.writeDefault__();
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* Serializes and writes a value to localStorage.
|
|
75
|
-
*/
|
|
76
|
-
write(value) {
|
|
77
|
-
this.logger_.logMethodArgs?.("write", { value });
|
|
78
|
-
try {
|
|
79
|
-
localStorage.setItem(this.key__, JSON.stringify(value));
|
|
80
|
-
} catch (err) {
|
|
81
|
-
this.logger_.error("write", "write_stringify_error", { err });
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
/**
|
|
85
|
-
* Removes the item from localStorage.
|
|
86
|
-
*/
|
|
87
|
-
remove() {
|
|
88
|
-
localStorage.removeItem(this.key__);
|
|
89
|
-
}
|
|
90
|
-
/**
|
|
91
|
-
* Manages data migration by removing all previous versions of the item.
|
|
92
|
-
*/
|
|
93
|
-
migrate__() {
|
|
94
|
-
if (this.config_.version <= 1) return;
|
|
95
|
-
for (let i = 1; i < this.config_.version; i++) {
|
|
96
|
-
const oldKey = _LocalStorageProvider.getKey({ name: this.config_.name, version: i });
|
|
97
|
-
localStorage.removeItem(oldKey);
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
};
|
|
101
|
-
|
|
102
|
-
// src/main.ts
|
|
103
|
-
function createLocalStorageProvider(config) {
|
|
104
|
-
return new LocalStorageProvider(config);
|
|
105
|
-
}
|
|
106
|
-
export {
|
|
107
|
-
LocalStorageProvider,
|
|
108
|
-
createLocalStorageProvider
|
|
109
|
-
};
|
|
1
|
+
/* @alwatr/local-storage v6.1.3 */
|
|
2
|
+
import{createLogger}from"@alwatr/logger";var LocalStorageProvider=class _LocalStorageProvider{constructor(config_){this.config_=config_;this.logger_=createLogger(`local-storage-provider: ${this.config_.name}, v: ${this.config_.version}`);this.logger_.logMethodArgs?.("constructor",{config:this.config_});this.key__=_LocalStorageProvider.getKey(this.config_);this.migrate__()}static{this.version="6.1.3"}static getKey(meta){return`${meta.name}.v${meta.version}`}static has(meta){const key=_LocalStorageProvider.getKey(meta);return localStorage.getItem(key)!==null}writeDefault__(){this.logger_.logMethodArgs?.("writeDefaultــ",this.config_.defaultValue);this.write(this.config_.defaultValue);return this.config_.defaultValue}read(){try{const value=localStorage.getItem(this.key__);if(value===null){this.logger_.logMethod?.("read//no_value");return this.writeDefault__()}const parsedValue=JSON.parse(value);this.logger_.logMethodFull?.("read//value",void 0,{parsedValue});return parsedValue}catch(err){this.logger_.error("read","read_parse_error",{err});return this.writeDefault__()}}write(value){this.logger_.logMethodArgs?.("write",{value});try{localStorage.setItem(this.key__,JSON.stringify(value))}catch(err){this.logger_.error("write","write_stringify_error",{err})}}remove(){localStorage.removeItem(this.key__)}migrate__(){if(this.config_.version<=1)return;for(let i=1;i<this.config_.version;i++){const oldKey=_LocalStorageProvider.getKey({name:this.config_.name,version:i});localStorage.removeItem(oldKey)}}};function createLocalStorageProvider(config){return new LocalStorageProvider(config)}export{LocalStorageProvider,createLocalStorageProvider};
|
|
110
3
|
//# sourceMappingURL=main.mjs.map
|
package/dist/main.mjs.map
CHANGED
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/local-storage.provider.ts", "../src/main.ts"],
|
|
4
4
|
"sourcesContent": ["import {createLogger} from '@alwatr/logger';\n\nimport type {LocalStorageProviderConfig, StorageMeta} from './type.js';\n\n/**\n * A provider class for managing a specific, versioned item in localStorage.\n * It encapsulates the logic for key generation, serialization, and migration.\n *\n * @example\n * ```typescript\n * const userSettings = new LocalStorageProvider({\n * name: 'user-settings',\n * version: 1,\n * defaultValue: { theme: 'light', notifications: true }\n * });\n *\n * // Write new settings\n * userSettings.write({ theme: 'dark', notifications: false });\n *\n * // Read the current settings\n * const currentSettings = userSettings.read();\n * console.log(currentSettings); // { theme: 'dark', notifications: false }\n * ```\n */\nexport class LocalStorageProvider<T extends JsonValue> {\n public static readonly version = __package_version__;\n\n private readonly key__: string;\n protected readonly logger_ = createLogger(`local-storage-provider: ${this.config_.name}, v: ${this.config_.version}`);\n\n public constructor(protected readonly config_: LocalStorageProviderConfig<T>) {\n this.logger_.logMethodArgs?.('constructor', {config: this.config_});\n this.key__ = LocalStorageProvider.getKey(this.config_);\n this.migrate__();\n }\n\n /**\n * Generates the versioned storage key.\n * @param meta - An object containing the name and version.\n * @returns The versioned key string.\n */\n public static getKey(meta: StorageMeta): string {\n return `${meta.name}.v${meta.version}`;\n }\n\n /**\n * Statically checks if a versioned item exists in localStorage.\n * This method provides a high-performance way to check for data existence without the overhead of creating a full provider instance.\n *\n * @param meta - An object containing the name and version of the item to check.\n * @returns `true` if the item exists, otherwise `false`.\n *\n * @example\n * ```typescript\n * const formExists = LocalStorageProvider.has({ name: 'user-form', version: 1 });\n * if (formExists) {\n * // Show the \"Thank you\" message\n * } else {\n * // Show the form\n * }\n * ```\n */\n public static has(meta: StorageMeta): boolean {\n const key = LocalStorageProvider.getKey(meta);\n return localStorage.getItem(key) !== null;\n }\n\n /**\n * Writes the default value to localStorage and returns it.\n */\n private writeDefault__(): T {\n this.logger_.logMethodArgs?.('writeDefaultــ', this.config_.defaultValue);\n this.write(this.config_.defaultValue);\n return this.config_.defaultValue;\n }\n\n /**\n * Reads and parses the value from localStorage.\n * If the item doesn't exist, is invalid JSON, or doesn't match the expected type,\n * it writes and returns the default value.\n */\n public read(): T {\n try {\n const value = localStorage.getItem(this.key__);\n\n if (value === null) {\n this.logger_.logMethod?.('read//no_value');\n return this.writeDefault__();\n }\n\n const parsedValue = JSON.parse(value) as T;\n this.logger_.logMethodFull?.('read//value', undefined, {parsedValue});\n return parsedValue;\n }\n catch (err) {\n this.logger_.error('read', 'read_parse_error', {err});\n return this.writeDefault__();\n }\n }\n\n /**\n * Serializes and writes a value to localStorage.\n */\n public write(value: T): void {\n this.logger_.logMethodArgs?.('write', {value});\n try {\n localStorage.setItem(this.key__, JSON.stringify(value));\n }\n catch (err) {\n this.logger_.error('write', 'write_stringify_error', {err});\n }\n }\n\n /**\n * Removes the item from localStorage.\n */\n public remove(): void {\n localStorage.removeItem(this.key__);\n }\n\n /**\n * Manages data migration by removing all previous versions of the item.\n */\n private migrate__(): void {\n if (this.config_.version <= 1) return;\n\n // Iterate from v1 up to the version just before the current one and remove them.\n for (let i = 1; i < this.config_.version; i++) {\n const oldKey = LocalStorageProvider.getKey({name: this.config_.name, version: i});\n localStorage.removeItem(oldKey);\n }\n }\n}\n", "import {LocalStorageProvider} from './local-storage.provider.js';\n\nimport type {LocalStorageProviderConfig} from './type.js';\n\nexport * from './local-storage.provider.js';\nexport type * from './type.js';\n\n/**\n * Factory function to create a new LocalStorageProvider.\n *\n * @param config - The configuration for the provider.\n * @returns An instance of LocalStorageProvider.\n *\n * @example\n * ```typescript\n * const userSettings = createLocalStorageProvider({\n * name: 'user-settings',\n * version: 1,\n * defaultValue: { theme: 'light', notifications: true }\n * });\n *\n * // Write new settings\n * userSettings.write({ theme: 'dark', notifications: false });\n *\n * // Read the current settings\n * const currentSettings = userSettings.read();\n * console.log(currentSettings); // { theme: 'dark', notifications: false }\n * ```\n */\nexport function createLocalStorageProvider<T extends JsonValue>(config: LocalStorageProviderConfig<T>): LocalStorageProvider<T> {\n return new LocalStorageProvider<T>(config);\n}\n"],
|
|
5
|
-
"mappings": "
|
|
5
|
+
"mappings": ";AAAA,OAAQ,iBAAmB,iBAwBpB,IAAM,qBAAN,MAAM,qBAA0C,CAM9C,YAA+B,QAAwC,CAAxC,qBAFtC,KAAmB,QAAU,aAAa,2BAA2B,KAAK,QAAQ,IAAI,QAAQ,KAAK,QAAQ,OAAO,EAAE,EAGlH,KAAK,QAAQ,gBAAgB,cAAe,CAAC,OAAQ,KAAK,OAAO,CAAC,EAClE,KAAK,MAAQ,sBAAqB,OAAO,KAAK,OAAO,EACrD,KAAK,UAAU,CACjB,CATA,YAAuB,QAAU,QAgBjC,OAAc,OAAO,KAA2B,CAC9C,MAAO,GAAG,KAAK,IAAI,KAAK,KAAK,OAAO,EACtC,CAmBA,OAAc,IAAI,KAA4B,CAC5C,MAAM,IAAM,sBAAqB,OAAO,IAAI,EAC5C,OAAO,aAAa,QAAQ,GAAG,IAAM,IACvC,CAKQ,gBAAoB,CAC1B,KAAK,QAAQ,gBAAgB,iBAAkB,KAAK,QAAQ,YAAY,EACxE,KAAK,MAAM,KAAK,QAAQ,YAAY,EACpC,OAAO,KAAK,QAAQ,YACtB,CAOO,MAAU,CACf,GAAI,CACF,MAAM,MAAQ,aAAa,QAAQ,KAAK,KAAK,EAE7C,GAAI,QAAU,KAAM,CAClB,KAAK,QAAQ,YAAY,gBAAgB,EACzC,OAAO,KAAK,eAAe,CAC7B,CAEA,MAAM,YAAc,KAAK,MAAM,KAAK,EACpC,KAAK,QAAQ,gBAAgB,cAAe,OAAW,CAAC,WAAW,CAAC,EACpE,OAAO,WACT,OACO,IAAK,CACV,KAAK,QAAQ,MAAM,OAAQ,mBAAoB,CAAC,GAAG,CAAC,EACpD,OAAO,KAAK,eAAe,CAC7B,CACF,CAKO,MAAM,MAAgB,CAC3B,KAAK,QAAQ,gBAAgB,QAAS,CAAC,KAAK,CAAC,EAC7C,GAAI,CACF,aAAa,QAAQ,KAAK,MAAO,KAAK,UAAU,KAAK,CAAC,CACxD,OACO,IAAK,CACV,KAAK,QAAQ,MAAM,QAAS,wBAAyB,CAAC,GAAG,CAAC,CAC5D,CACF,CAKO,QAAe,CACpB,aAAa,WAAW,KAAK,KAAK,CACpC,CAKQ,WAAkB,CACxB,GAAI,KAAK,QAAQ,SAAW,EAAG,OAG/B,QAAS,EAAI,EAAG,EAAI,KAAK,QAAQ,QAAS,IAAK,CAC7C,MAAM,OAAS,sBAAqB,OAAO,CAAC,KAAM,KAAK,QAAQ,KAAM,QAAS,CAAC,CAAC,EAChF,aAAa,WAAW,MAAM,CAChC,CACF,CACF,ECvGO,SAAS,2BAAgD,OAAgE,CAC9H,OAAO,IAAI,qBAAwB,MAAM,CAC3C",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/type.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"type.d.ts","sourceRoot":"","sources":["../src/type.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"type.d.ts","sourceRoot":"","sources":["../src/type.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,WAAW;IAC1B;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,0BAA0B,CAAC,CAAC,CAAE,SAAQ,WAAW;IAChE;;OAEG;IACH,YAAY,EAAE,CAAC,CAAC;CACjB"}
|
package/package.json
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@alwatr/local-storage",
|
|
3
3
|
"description": "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
|
-
"version": "6.1.
|
|
4
|
+
"version": "6.1.3",
|
|
5
5
|
"author": "S. Ali Mihandoost <ali.mihandoost@gmail.com>",
|
|
6
6
|
"bugs": "https://github.com/Alwatr/nanolib/issues",
|
|
7
7
|
"dependencies": {
|
|
8
|
-
"@alwatr/logger": "
|
|
8
|
+
"@alwatr/logger": "6.0.1"
|
|
9
9
|
},
|
|
10
10
|
"devDependencies": {
|
|
11
|
-
"@alwatr/nano-build": "6.
|
|
11
|
+
"@alwatr/nano-build": "6.2.0",
|
|
12
12
|
"@alwatr/prettier-config": "5.0.3",
|
|
13
13
|
"@alwatr/tsconfig-base": "6.0.1",
|
|
14
14
|
"@alwatr/type-helper": "6.0.2",
|
|
@@ -30,21 +30,21 @@
|
|
|
30
30
|
"homepage": "https://github.com/Alwatr/nanolib/tree/next/packages/local-storage#readme",
|
|
31
31
|
"keywords": [
|
|
32
32
|
"alwatr",
|
|
33
|
-
"
|
|
34
|
-
"JSON storage",
|
|
33
|
+
"automatic migration",
|
|
35
34
|
"browser storage",
|
|
35
|
+
"cross-platform",
|
|
36
36
|
"data persistence",
|
|
37
|
-
"
|
|
38
|
-
"automatic migration",
|
|
39
|
-
"provider pattern",
|
|
37
|
+
"ESM",
|
|
40
38
|
"facade factory",
|
|
41
|
-
"TypeScript",
|
|
42
39
|
"JavaScript",
|
|
43
|
-
"
|
|
40
|
+
"JSON storage",
|
|
41
|
+
"localStorage",
|
|
44
42
|
"module",
|
|
45
43
|
"nanolib",
|
|
46
|
-
"
|
|
47
|
-
"
|
|
44
|
+
"provider pattern",
|
|
45
|
+
"TypeScript",
|
|
46
|
+
"utility",
|
|
47
|
+
"versioning"
|
|
48
48
|
],
|
|
49
49
|
"license": "MPL-2.0",
|
|
50
50
|
"main": "./dist/main.cjs",
|
|
@@ -74,5 +74,5 @@
|
|
|
74
74
|
},
|
|
75
75
|
"type": "module",
|
|
76
76
|
"types": "./dist/main.d.ts",
|
|
77
|
-
"gitHead": "
|
|
77
|
+
"gitHead": "e081773e1ba6bf1c62c07d7dc966b174fa7dd3ea"
|
|
78
78
|
}
|