@lytjs/plugin-storage 5.0.1 → 6.4.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/dist/index.cjs +151 -1
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +39 -0
- package/dist/index.d.ts +39 -0
- package/dist/index.mjs +146 -1
- package/dist/index.mjs.map +1 -0
- package/package.json +33 -25
- package/README.md +0 -149
- package/dist/types/index.d.ts +0 -60
- package/dist/types/index.d.ts.map +0 -1
package/dist/index.cjs
CHANGED
|
@@ -1 +1,151 @@
|
|
|
1
|
-
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var core = require('@lytjs/core');
|
|
6
|
+
|
|
7
|
+
// src/index.ts
|
|
8
|
+
function createStorage(options = {}) {
|
|
9
|
+
const {
|
|
10
|
+
defaultType = "local",
|
|
11
|
+
prefix = "lyt_"
|
|
12
|
+
} = options;
|
|
13
|
+
function getStorage(type) {
|
|
14
|
+
if (typeof window === "undefined") return null;
|
|
15
|
+
try {
|
|
16
|
+
return type === "local" ? window.localStorage : window.sessionStorage;
|
|
17
|
+
} catch {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function getKey(key) {
|
|
22
|
+
return `${prefix}${key}`;
|
|
23
|
+
}
|
|
24
|
+
function set(key, value, expires) {
|
|
25
|
+
const storage = getStorage(defaultType);
|
|
26
|
+
if (!storage) return;
|
|
27
|
+
const item = {
|
|
28
|
+
value,
|
|
29
|
+
expires: expires ? Date.now() + expires : void 0
|
|
30
|
+
};
|
|
31
|
+
try {
|
|
32
|
+
storage.setItem(getKey(key), JSON.stringify(item));
|
|
33
|
+
} catch {
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
function get(key, defaultValue) {
|
|
37
|
+
const storage = getStorage(defaultType);
|
|
38
|
+
if (!storage) return defaultValue ?? null;
|
|
39
|
+
try {
|
|
40
|
+
const raw = storage.getItem(getKey(key));
|
|
41
|
+
if (!raw) return defaultValue ?? null;
|
|
42
|
+
const item = JSON.parse(raw);
|
|
43
|
+
if (item.expires && Date.now() > item.expires) {
|
|
44
|
+
remove(key);
|
|
45
|
+
return defaultValue ?? null;
|
|
46
|
+
}
|
|
47
|
+
return item.value;
|
|
48
|
+
} catch {
|
|
49
|
+
return defaultValue ?? null;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
function remove(key) {
|
|
53
|
+
const storage = getStorage(defaultType);
|
|
54
|
+
if (!storage) return;
|
|
55
|
+
try {
|
|
56
|
+
storage.removeItem(getKey(key));
|
|
57
|
+
} catch {
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
function clear() {
|
|
61
|
+
const storage = getStorage(defaultType);
|
|
62
|
+
if (!storage) return;
|
|
63
|
+
try {
|
|
64
|
+
const keysToRemove = [];
|
|
65
|
+
for (let i = 0; i < storage.length; i++) {
|
|
66
|
+
const key = storage.key(i);
|
|
67
|
+
if (key && key.startsWith(prefix)) {
|
|
68
|
+
keysToRemove.push(key);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
keysToRemove.forEach((k) => storage.removeItem(k));
|
|
72
|
+
} catch {
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
function has(key) {
|
|
76
|
+
return get(key) !== null;
|
|
77
|
+
}
|
|
78
|
+
function keys() {
|
|
79
|
+
const storage = getStorage(defaultType);
|
|
80
|
+
if (!storage) return [];
|
|
81
|
+
const result = [];
|
|
82
|
+
try {
|
|
83
|
+
for (let i = 0; i < storage.length; i++) {
|
|
84
|
+
const key = storage.key(i);
|
|
85
|
+
if (key && key.startsWith(prefix)) {
|
|
86
|
+
result.push(key.slice(prefix.length));
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
} catch {
|
|
90
|
+
}
|
|
91
|
+
return result;
|
|
92
|
+
}
|
|
93
|
+
function clearExpired() {
|
|
94
|
+
const storage = getStorage(defaultType);
|
|
95
|
+
if (!storage) return;
|
|
96
|
+
try {
|
|
97
|
+
const keysToRemove = [];
|
|
98
|
+
for (let i = 0; i < storage.length; i++) {
|
|
99
|
+
const fullKey = storage.key(i);
|
|
100
|
+
if (!fullKey || !fullKey.startsWith(prefix)) continue;
|
|
101
|
+
try {
|
|
102
|
+
const raw = storage.getItem(fullKey);
|
|
103
|
+
if (!raw) continue;
|
|
104
|
+
const item = JSON.parse(raw);
|
|
105
|
+
if (item.expires && Date.now() > item.expires) {
|
|
106
|
+
keysToRemove.push(fullKey);
|
|
107
|
+
}
|
|
108
|
+
} catch {
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
keysToRemove.forEach((k) => storage.removeItem(k));
|
|
112
|
+
} catch {
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return {
|
|
116
|
+
set,
|
|
117
|
+
get,
|
|
118
|
+
remove,
|
|
119
|
+
clear,
|
|
120
|
+
has,
|
|
121
|
+
keys,
|
|
122
|
+
clearExpired
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
var pluginStorage = core.definePlugin({
|
|
126
|
+
name: "storage",
|
|
127
|
+
version: "6.0.0",
|
|
128
|
+
description: "LytJS official storage plugin with localStorage and sessionStorage support, plus JSON serialization",
|
|
129
|
+
author: "LytJS Team",
|
|
130
|
+
keywords: ["lytjs", "storage", "localStorage", "sessionStorage", "persistence"],
|
|
131
|
+
schema: {
|
|
132
|
+
type: "object",
|
|
133
|
+
object: {
|
|
134
|
+
properties: {
|
|
135
|
+
defaultType: { type: "string", default: "local" },
|
|
136
|
+
prefix: { type: "string", default: "lyt_" }
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
},
|
|
140
|
+
install(app, options) {
|
|
141
|
+
const storage = createStorage(options);
|
|
142
|
+
app.config.globalProperties.$storage = storage;
|
|
143
|
+
app.provide("lyt-storage", storage);
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
var index_default = pluginStorage;
|
|
147
|
+
|
|
148
|
+
exports.createStorage = createStorage;
|
|
149
|
+
exports.default = index_default;
|
|
150
|
+
//# sourceMappingURL=index.cjs.map
|
|
151
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"names":["definePlugin"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\r\n * @lytjs/plugin-storage\r\n *\r\n * LytJS official storage plugin with localStorage and sessionStorage support, plus JSON serialization.\r\n *\r\n * @packageDocumentation\r\n */\r\n\r\nimport { definePlugin } from '@lytjs/core';\r\nimport type { StorageType, StorageItem, StorageOptions, StorageInstance } from './types';\r\n\r\nfunction createStorage(options: StorageOptions = {}): StorageInstance {\r\n const {\r\n defaultType = 'local',\r\n prefix = 'lyt_',\r\n } = options;\r\n\r\n function getStorage(type: StorageType): Storage | null {\r\n if (typeof window === 'undefined') return null;\r\n try {\r\n return type === 'local' ? window.localStorage : window.sessionStorage;\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n function getKey(key: string): string {\r\n return `${prefix}${key}`;\r\n }\r\n\r\n function set<T>(key: string, value: T, expires?: number) {\r\n const storage = getStorage(defaultType);\r\n if (!storage) return;\r\n\r\n const item: StorageItem<T> = {\r\n value,\r\n expires: expires ? Date.now() + expires : undefined,\r\n };\r\n\r\n try {\r\n storage.setItem(getKey(key), JSON.stringify(item));\r\n } catch {\r\n }\r\n }\r\n\r\n function get<T>(key: string, defaultValue?: T): T | null {\r\n const storage = getStorage(defaultType);\r\n if (!storage) return defaultValue ?? null;\r\n\r\n try {\r\n const raw = storage.getItem(getKey(key));\r\n if (!raw) return defaultValue ?? null;\r\n\r\n const item: StorageItem<T> = JSON.parse(raw);\r\n\r\n if (item.expires && Date.now() > item.expires) {\r\n remove(key);\r\n return defaultValue ?? null;\r\n }\r\n\r\n return item.value;\r\n } catch {\r\n return defaultValue ?? null;\r\n }\r\n }\r\n\r\n function remove(key: string) {\r\n const storage = getStorage(defaultType);\r\n if (!storage) return;\r\n\r\n try {\r\n storage.removeItem(getKey(key));\r\n } catch {\r\n }\r\n }\r\n\r\n function clear() {\r\n const storage = getStorage(defaultType);\r\n if (!storage) return;\r\n\r\n try {\r\n const keysToRemove: string[] = [];\r\n for (let i = 0; i < storage.length; i++) {\r\n const key = storage.key(i);\r\n if (key && key.startsWith(prefix)) {\r\n keysToRemove.push(key);\r\n }\r\n }\r\n keysToRemove.forEach((k) => storage.removeItem(k));\r\n } catch {\r\n }\r\n }\r\n\r\n function has(key: string): boolean {\r\n return get(key) !== null;\r\n }\r\n\r\n function keys(): string[] {\r\n const storage = getStorage(defaultType);\r\n if (!storage) return [];\r\n\r\n const result: string[] = [];\r\n try {\r\n for (let i = 0; i < storage.length; i++) {\r\n const key = storage.key(i);\r\n if (key && key.startsWith(prefix)) {\r\n result.push(key.slice(prefix.length));\r\n }\r\n }\r\n } catch {\r\n }\r\n return result;\r\n }\r\n\r\n function clearExpired() {\r\n const storage = getStorage(defaultType);\r\n if (!storage) return;\r\n\r\n try {\r\n const keysToRemove: string[] = [];\r\n for (let i = 0; i < storage.length; i++) {\r\n const fullKey = storage.key(i);\r\n if (!fullKey || !fullKey.startsWith(prefix)) continue;\r\n\r\n try {\r\n const raw = storage.getItem(fullKey);\r\n if (!raw) continue;\r\n\r\n const item: StorageItem = JSON.parse(raw);\r\n if (item.expires && Date.now() > item.expires) {\r\n keysToRemove.push(fullKey);\r\n }\r\n } catch {\r\n }\r\n }\r\n keysToRemove.forEach((k) => storage.removeItem(k));\r\n } catch {\r\n }\r\n }\r\n\r\n return {\r\n set,\r\n get,\r\n remove,\r\n clear,\r\n has,\r\n keys,\r\n clearExpired,\r\n };\r\n}\r\n\r\nconst pluginStorage = definePlugin({\r\n name: 'storage',\r\n version: '6.0.0',\r\n description: 'LytJS official storage plugin with localStorage and sessionStorage support, plus JSON serialization',\r\n author: 'LytJS Team',\r\n keywords: ['lytjs', 'storage', 'localStorage', 'sessionStorage', 'persistence'],\r\n schema: {\r\n type: 'object',\r\n object: {\r\n properties: {\r\n defaultType: { type: 'string', default: 'local' },\r\n prefix: { type: 'string', default: 'lyt_' },\r\n },\r\n },\r\n },\r\n install(app, options) {\r\n const storage = createStorage(options as StorageOptions);\r\n\r\n app.config.globalProperties.$storage = storage;\r\n\r\n app.provide('lyt-storage', storage);\r\n },\r\n});\r\n\r\nexport default pluginStorage;\r\nexport type { StorageType, StorageItem, StorageOptions, StorageInstance };\r\nexport { createStorage };\r\n"]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import * as _lytjs_core from '@lytjs/core';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @lytjs/plugin-storage - 类型定义
|
|
5
|
+
*/
|
|
6
|
+
type StorageType = 'local' | 'session';
|
|
7
|
+
interface StorageItem<T = unknown> {
|
|
8
|
+
/** 数据 */
|
|
9
|
+
value: T;
|
|
10
|
+
/** 过期时间戳 */
|
|
11
|
+
expires?: number;
|
|
12
|
+
}
|
|
13
|
+
interface StorageOptions {
|
|
14
|
+
/** 默认存储类型 */
|
|
15
|
+
defaultType?: StorageType;
|
|
16
|
+
/** 命名空间前缀 */
|
|
17
|
+
prefix?: string;
|
|
18
|
+
}
|
|
19
|
+
interface StorageInstance {
|
|
20
|
+
/** 设置值 */
|
|
21
|
+
set: <T>(key: string, value: T, expires?: number) => void;
|
|
22
|
+
/** 获取值 */
|
|
23
|
+
get: <T>(key: string, defaultValue?: T) => T | null;
|
|
24
|
+
/** 删除值 */
|
|
25
|
+
remove: (key: string) => void;
|
|
26
|
+
/** 清空所有值 */
|
|
27
|
+
clear: () => void;
|
|
28
|
+
/** 检查是否存在 */
|
|
29
|
+
has: (key: string) => boolean;
|
|
30
|
+
/** 获取所有 keys */
|
|
31
|
+
keys: () => string[];
|
|
32
|
+
/** 移除过期项 */
|
|
33
|
+
clearExpired: () => void;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
declare function createStorage(options?: StorageOptions): StorageInstance;
|
|
37
|
+
declare const pluginStorage: _lytjs_core.PluginDefinition<unknown>;
|
|
38
|
+
|
|
39
|
+
export { type StorageInstance, type StorageItem, type StorageOptions, type StorageType, createStorage, pluginStorage as default };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import * as _lytjs_core from '@lytjs/core';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @lytjs/plugin-storage - 类型定义
|
|
5
|
+
*/
|
|
6
|
+
type StorageType = 'local' | 'session';
|
|
7
|
+
interface StorageItem<T = unknown> {
|
|
8
|
+
/** 数据 */
|
|
9
|
+
value: T;
|
|
10
|
+
/** 过期时间戳 */
|
|
11
|
+
expires?: number;
|
|
12
|
+
}
|
|
13
|
+
interface StorageOptions {
|
|
14
|
+
/** 默认存储类型 */
|
|
15
|
+
defaultType?: StorageType;
|
|
16
|
+
/** 命名空间前缀 */
|
|
17
|
+
prefix?: string;
|
|
18
|
+
}
|
|
19
|
+
interface StorageInstance {
|
|
20
|
+
/** 设置值 */
|
|
21
|
+
set: <T>(key: string, value: T, expires?: number) => void;
|
|
22
|
+
/** 获取值 */
|
|
23
|
+
get: <T>(key: string, defaultValue?: T) => T | null;
|
|
24
|
+
/** 删除值 */
|
|
25
|
+
remove: (key: string) => void;
|
|
26
|
+
/** 清空所有值 */
|
|
27
|
+
clear: () => void;
|
|
28
|
+
/** 检查是否存在 */
|
|
29
|
+
has: (key: string) => boolean;
|
|
30
|
+
/** 获取所有 keys */
|
|
31
|
+
keys: () => string[];
|
|
32
|
+
/** 移除过期项 */
|
|
33
|
+
clearExpired: () => void;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
declare function createStorage(options?: StorageOptions): StorageInstance;
|
|
37
|
+
declare const pluginStorage: _lytjs_core.PluginDefinition<unknown>;
|
|
38
|
+
|
|
39
|
+
export { type StorageInstance, type StorageItem, type StorageOptions, type StorageType, createStorage, pluginStorage as default };
|
package/dist/index.mjs
CHANGED
|
@@ -1 +1,146 @@
|
|
|
1
|
-
|
|
1
|
+
import { definePlugin } from '@lytjs/core';
|
|
2
|
+
|
|
3
|
+
// src/index.ts
|
|
4
|
+
function createStorage(options = {}) {
|
|
5
|
+
const {
|
|
6
|
+
defaultType = "local",
|
|
7
|
+
prefix = "lyt_"
|
|
8
|
+
} = options;
|
|
9
|
+
function getStorage(type) {
|
|
10
|
+
if (typeof window === "undefined") return null;
|
|
11
|
+
try {
|
|
12
|
+
return type === "local" ? window.localStorage : window.sessionStorage;
|
|
13
|
+
} catch {
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
function getKey(key) {
|
|
18
|
+
return `${prefix}${key}`;
|
|
19
|
+
}
|
|
20
|
+
function set(key, value, expires) {
|
|
21
|
+
const storage = getStorage(defaultType);
|
|
22
|
+
if (!storage) return;
|
|
23
|
+
const item = {
|
|
24
|
+
value,
|
|
25
|
+
expires: expires ? Date.now() + expires : void 0
|
|
26
|
+
};
|
|
27
|
+
try {
|
|
28
|
+
storage.setItem(getKey(key), JSON.stringify(item));
|
|
29
|
+
} catch {
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
function get(key, defaultValue) {
|
|
33
|
+
const storage = getStorage(defaultType);
|
|
34
|
+
if (!storage) return defaultValue ?? null;
|
|
35
|
+
try {
|
|
36
|
+
const raw = storage.getItem(getKey(key));
|
|
37
|
+
if (!raw) return defaultValue ?? null;
|
|
38
|
+
const item = JSON.parse(raw);
|
|
39
|
+
if (item.expires && Date.now() > item.expires) {
|
|
40
|
+
remove(key);
|
|
41
|
+
return defaultValue ?? null;
|
|
42
|
+
}
|
|
43
|
+
return item.value;
|
|
44
|
+
} catch {
|
|
45
|
+
return defaultValue ?? null;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
function remove(key) {
|
|
49
|
+
const storage = getStorage(defaultType);
|
|
50
|
+
if (!storage) return;
|
|
51
|
+
try {
|
|
52
|
+
storage.removeItem(getKey(key));
|
|
53
|
+
} catch {
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
function clear() {
|
|
57
|
+
const storage = getStorage(defaultType);
|
|
58
|
+
if (!storage) return;
|
|
59
|
+
try {
|
|
60
|
+
const keysToRemove = [];
|
|
61
|
+
for (let i = 0; i < storage.length; i++) {
|
|
62
|
+
const key = storage.key(i);
|
|
63
|
+
if (key && key.startsWith(prefix)) {
|
|
64
|
+
keysToRemove.push(key);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
keysToRemove.forEach((k) => storage.removeItem(k));
|
|
68
|
+
} catch {
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
function has(key) {
|
|
72
|
+
return get(key) !== null;
|
|
73
|
+
}
|
|
74
|
+
function keys() {
|
|
75
|
+
const storage = getStorage(defaultType);
|
|
76
|
+
if (!storage) return [];
|
|
77
|
+
const result = [];
|
|
78
|
+
try {
|
|
79
|
+
for (let i = 0; i < storage.length; i++) {
|
|
80
|
+
const key = storage.key(i);
|
|
81
|
+
if (key && key.startsWith(prefix)) {
|
|
82
|
+
result.push(key.slice(prefix.length));
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
} catch {
|
|
86
|
+
}
|
|
87
|
+
return result;
|
|
88
|
+
}
|
|
89
|
+
function clearExpired() {
|
|
90
|
+
const storage = getStorage(defaultType);
|
|
91
|
+
if (!storage) return;
|
|
92
|
+
try {
|
|
93
|
+
const keysToRemove = [];
|
|
94
|
+
for (let i = 0; i < storage.length; i++) {
|
|
95
|
+
const fullKey = storage.key(i);
|
|
96
|
+
if (!fullKey || !fullKey.startsWith(prefix)) continue;
|
|
97
|
+
try {
|
|
98
|
+
const raw = storage.getItem(fullKey);
|
|
99
|
+
if (!raw) continue;
|
|
100
|
+
const item = JSON.parse(raw);
|
|
101
|
+
if (item.expires && Date.now() > item.expires) {
|
|
102
|
+
keysToRemove.push(fullKey);
|
|
103
|
+
}
|
|
104
|
+
} catch {
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
keysToRemove.forEach((k) => storage.removeItem(k));
|
|
108
|
+
} catch {
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return {
|
|
112
|
+
set,
|
|
113
|
+
get,
|
|
114
|
+
remove,
|
|
115
|
+
clear,
|
|
116
|
+
has,
|
|
117
|
+
keys,
|
|
118
|
+
clearExpired
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
var pluginStorage = definePlugin({
|
|
122
|
+
name: "storage",
|
|
123
|
+
version: "6.0.0",
|
|
124
|
+
description: "LytJS official storage plugin with localStorage and sessionStorage support, plus JSON serialization",
|
|
125
|
+
author: "LytJS Team",
|
|
126
|
+
keywords: ["lytjs", "storage", "localStorage", "sessionStorage", "persistence"],
|
|
127
|
+
schema: {
|
|
128
|
+
type: "object",
|
|
129
|
+
object: {
|
|
130
|
+
properties: {
|
|
131
|
+
defaultType: { type: "string", default: "local" },
|
|
132
|
+
prefix: { type: "string", default: "lyt_" }
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
},
|
|
136
|
+
install(app, options) {
|
|
137
|
+
const storage = createStorage(options);
|
|
138
|
+
app.config.globalProperties.$storage = storage;
|
|
139
|
+
app.provide("lyt-storage", storage);
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
var index_default = pluginStorage;
|
|
143
|
+
|
|
144
|
+
export { createStorage, index_default as default };
|
|
145
|
+
//# sourceMappingURL=index.mjs.map
|
|
146
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\r\n * @lytjs/plugin-storage\r\n *\r\n * LytJS official storage plugin with localStorage and sessionStorage support, plus JSON serialization.\r\n *\r\n * @packageDocumentation\r\n */\r\n\r\nimport { definePlugin } from '@lytjs/core';\r\nimport type { StorageType, StorageItem, StorageOptions, StorageInstance } from './types';\r\n\r\nfunction createStorage(options: StorageOptions = {}): StorageInstance {\r\n const {\r\n defaultType = 'local',\r\n prefix = 'lyt_',\r\n } = options;\r\n\r\n function getStorage(type: StorageType): Storage | null {\r\n if (typeof window === 'undefined') return null;\r\n try {\r\n return type === 'local' ? window.localStorage : window.sessionStorage;\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n function getKey(key: string): string {\r\n return `${prefix}${key}`;\r\n }\r\n\r\n function set<T>(key: string, value: T, expires?: number) {\r\n const storage = getStorage(defaultType);\r\n if (!storage) return;\r\n\r\n const item: StorageItem<T> = {\r\n value,\r\n expires: expires ? Date.now() + expires : undefined,\r\n };\r\n\r\n try {\r\n storage.setItem(getKey(key), JSON.stringify(item));\r\n } catch {\r\n }\r\n }\r\n\r\n function get<T>(key: string, defaultValue?: T): T | null {\r\n const storage = getStorage(defaultType);\r\n if (!storage) return defaultValue ?? null;\r\n\r\n try {\r\n const raw = storage.getItem(getKey(key));\r\n if (!raw) return defaultValue ?? null;\r\n\r\n const item: StorageItem<T> = JSON.parse(raw);\r\n\r\n if (item.expires && Date.now() > item.expires) {\r\n remove(key);\r\n return defaultValue ?? null;\r\n }\r\n\r\n return item.value;\r\n } catch {\r\n return defaultValue ?? null;\r\n }\r\n }\r\n\r\n function remove(key: string) {\r\n const storage = getStorage(defaultType);\r\n if (!storage) return;\r\n\r\n try {\r\n storage.removeItem(getKey(key));\r\n } catch {\r\n }\r\n }\r\n\r\n function clear() {\r\n const storage = getStorage(defaultType);\r\n if (!storage) return;\r\n\r\n try {\r\n const keysToRemove: string[] = [];\r\n for (let i = 0; i < storage.length; i++) {\r\n const key = storage.key(i);\r\n if (key && key.startsWith(prefix)) {\r\n keysToRemove.push(key);\r\n }\r\n }\r\n keysToRemove.forEach((k) => storage.removeItem(k));\r\n } catch {\r\n }\r\n }\r\n\r\n function has(key: string): boolean {\r\n return get(key) !== null;\r\n }\r\n\r\n function keys(): string[] {\r\n const storage = getStorage(defaultType);\r\n if (!storage) return [];\r\n\r\n const result: string[] = [];\r\n try {\r\n for (let i = 0; i < storage.length; i++) {\r\n const key = storage.key(i);\r\n if (key && key.startsWith(prefix)) {\r\n result.push(key.slice(prefix.length));\r\n }\r\n }\r\n } catch {\r\n }\r\n return result;\r\n }\r\n\r\n function clearExpired() {\r\n const storage = getStorage(defaultType);\r\n if (!storage) return;\r\n\r\n try {\r\n const keysToRemove: string[] = [];\r\n for (let i = 0; i < storage.length; i++) {\r\n const fullKey = storage.key(i);\r\n if (!fullKey || !fullKey.startsWith(prefix)) continue;\r\n\r\n try {\r\n const raw = storage.getItem(fullKey);\r\n if (!raw) continue;\r\n\r\n const item: StorageItem = JSON.parse(raw);\r\n if (item.expires && Date.now() > item.expires) {\r\n keysToRemove.push(fullKey);\r\n }\r\n } catch {\r\n }\r\n }\r\n keysToRemove.forEach((k) => storage.removeItem(k));\r\n } catch {\r\n }\r\n }\r\n\r\n return {\r\n set,\r\n get,\r\n remove,\r\n clear,\r\n has,\r\n keys,\r\n clearExpired,\r\n };\r\n}\r\n\r\nconst pluginStorage = definePlugin({\r\n name: 'storage',\r\n version: '6.0.0',\r\n description: 'LytJS official storage plugin with localStorage and sessionStorage support, plus JSON serialization',\r\n author: 'LytJS Team',\r\n keywords: ['lytjs', 'storage', 'localStorage', 'sessionStorage', 'persistence'],\r\n schema: {\r\n type: 'object',\r\n object: {\r\n properties: {\r\n defaultType: { type: 'string', default: 'local' },\r\n prefix: { type: 'string', default: 'lyt_' },\r\n },\r\n },\r\n },\r\n install(app, options) {\r\n const storage = createStorage(options as StorageOptions);\r\n\r\n app.config.globalProperties.$storage = storage;\r\n\r\n app.provide('lyt-storage', storage);\r\n },\r\n});\r\n\r\nexport default pluginStorage;\r\nexport type { StorageType, StorageItem, StorageOptions, StorageInstance };\r\nexport { createStorage };\r\n"]}
|
package/package.json
CHANGED
|
@@ -1,46 +1,54 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lytjs/plugin-storage",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "6.4.0",
|
|
4
|
+
"description": "LytJS official storage plugin with localStorage and sessionStorage support, plus JSON serialization",
|
|
5
|
+
"type": "module",
|
|
5
6
|
"main": "./dist/index.cjs",
|
|
6
7
|
"module": "./dist/index.mjs",
|
|
7
|
-
"types": "./dist/
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
8
9
|
"exports": {
|
|
9
10
|
".": {
|
|
10
|
-
"types": "./dist/
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
11
12
|
"import": "./dist/index.mjs",
|
|
12
|
-
"require": "./dist/index.cjs"
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
"require": "./dist/index.cjs"
|
|
14
|
+
},
|
|
15
|
+
"./package.json": "./package.json"
|
|
15
16
|
},
|
|
16
|
-
"sideEffects": false,
|
|
17
17
|
"files": [
|
|
18
18
|
"dist"
|
|
19
19
|
],
|
|
20
|
+
"sideEffects": false,
|
|
21
|
+
"scripts": {
|
|
22
|
+
"build": "tsup",
|
|
23
|
+
"dev": "tsup --watch",
|
|
24
|
+
"test": "vitest run",
|
|
25
|
+
"test:watch": "vitest",
|
|
26
|
+
"test:coverage": "vitest run --coverage",
|
|
27
|
+
"type-check": "tsc --noEmit",
|
|
28
|
+
"lint": "eslint \"src/**/*.ts\"",
|
|
29
|
+
"clean": "rm -rf dist"
|
|
30
|
+
},
|
|
31
|
+
"dependencies": {
|
|
32
|
+
"@lytjs/core": "^6.0.0",
|
|
33
|
+
"@lytjs/reactivity": "^6.0.0",
|
|
34
|
+
"@lytjs/common-is": "^6.0.0"
|
|
35
|
+
},
|
|
36
|
+
"devDependencies": {
|
|
37
|
+
"tsup": "^8.0.0",
|
|
38
|
+
"typescript": "^5.4.0",
|
|
39
|
+
"vitest": "^3.0.0"
|
|
40
|
+
},
|
|
20
41
|
"license": "MIT",
|
|
21
|
-
"author": "lytjs",
|
|
22
42
|
"repository": {
|
|
23
43
|
"type": "git",
|
|
24
|
-
"url": "https://gitee.com/lytjs/lytjs"
|
|
44
|
+
"url": "https://gitee.com/lytjs/lytjs.git",
|
|
45
|
+
"directory": "packages/plugins/packages/plugin-storage"
|
|
25
46
|
},
|
|
26
|
-
"homepage": "https://gitee.com/lytjs/lytjs",
|
|
27
47
|
"keywords": [
|
|
28
|
-
"lyt",
|
|
29
48
|
"lytjs",
|
|
30
|
-
"javascript",
|
|
31
|
-
"framework",
|
|
32
|
-
"frontend",
|
|
33
|
-
"vue-like",
|
|
34
|
-
"lightweight",
|
|
35
|
-
"zero-dependency",
|
|
36
49
|
"storage",
|
|
37
50
|
"localStorage",
|
|
51
|
+
"sessionStorage",
|
|
38
52
|
"persistence"
|
|
39
|
-
]
|
|
40
|
-
"engines": {
|
|
41
|
-
"node": ">=18.0.0"
|
|
42
|
-
},
|
|
43
|
-
"publishConfig": {
|
|
44
|
-
"access": "public"
|
|
45
|
-
}
|
|
53
|
+
]
|
|
46
54
|
}
|
package/README.md
DELETED
|
@@ -1,149 +0,0 @@
|
|
|
1
|
-
# @lytjs/plugin-storage
|
|
2
|
-
|
|
3
|
-
> Lyt.js 本地存储持久化插件 - 自动保存响应式状态到 localStorage/sessionStorage
|
|
4
|
-
|
|
5
|
-
**版本:** 4.2.0
|
|
6
|
-
|
|
7
|
-
## 安装
|
|
8
|
-
|
|
9
|
-
```bash
|
|
10
|
-
npm install @lytjs/plugin-storage
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
## 使用
|
|
14
|
-
|
|
15
|
-
### 注册插件
|
|
16
|
-
|
|
17
|
-
```typescript
|
|
18
|
-
import { createApp } from '@lytjs/core'
|
|
19
|
-
import { createStorage } from '@lytjs/plugin-storage'
|
|
20
|
-
|
|
21
|
-
const storage = createStorage({
|
|
22
|
-
prefix: 'lyt_',
|
|
23
|
-
expire: 24 * 60 * 60 * 1000, // 24 小时过期
|
|
24
|
-
})
|
|
25
|
-
|
|
26
|
-
const app = createApp({})
|
|
27
|
-
app.use(storage)
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
### 基本读写
|
|
31
|
-
|
|
32
|
-
```typescript
|
|
33
|
-
// 设置值
|
|
34
|
-
storage.set('user', { name: 'lyt', age: 18 })
|
|
35
|
-
|
|
36
|
-
// 获取值
|
|
37
|
-
const user = storage.get('user') // { name: 'lyt', age: 18 }
|
|
38
|
-
|
|
39
|
-
// 获取值(带默认值)
|
|
40
|
-
const theme = storage.get('theme', 'light') // 'light'
|
|
41
|
-
|
|
42
|
-
// 检查 key 是否存在
|
|
43
|
-
storage.has('user') // true
|
|
44
|
-
|
|
45
|
-
// 删除值
|
|
46
|
-
storage.remove('user')
|
|
47
|
-
|
|
48
|
-
// 获取所有 key
|
|
49
|
-
storage.keys() // ['theme']
|
|
50
|
-
|
|
51
|
-
// 获取存储项数量
|
|
52
|
-
storage.size() // 1
|
|
53
|
-
|
|
54
|
-
// 清空所有(仅当前前缀的)
|
|
55
|
-
storage.clear()
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
### 过期时间
|
|
59
|
-
|
|
60
|
-
```typescript
|
|
61
|
-
// 全局过期时间(创建时设置)
|
|
62
|
-
const storage = createStorage({ expire: 3600000 }) // 1 小时
|
|
63
|
-
|
|
64
|
-
// 单个 key 设置过期时间(覆盖全局设置)
|
|
65
|
-
storage.set('token', 'abc123', 30 * 60 * 1000) // 30 分钟过期
|
|
66
|
-
|
|
67
|
-
// 过期后自动返回 null
|
|
68
|
-
storage.get('token') // null(已过期)
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
### 响应式状态自动保存
|
|
72
|
-
|
|
73
|
-
```typescript
|
|
74
|
-
// 监听响应式对象变化,自动保存
|
|
75
|
-
const state = reactive({ count: 0, name: 'lyt' })
|
|
76
|
-
|
|
77
|
-
const unwatch = storage.watch(state, 'count', {
|
|
78
|
-
immediate: true, // 立即保存一次
|
|
79
|
-
deep: true, // 深度监听
|
|
80
|
-
debounce: 100, // 防抖 100ms
|
|
81
|
-
})
|
|
82
|
-
|
|
83
|
-
// 停止监听
|
|
84
|
-
unwatch()
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
### 从存储恢复状态
|
|
88
|
-
|
|
89
|
-
```typescript
|
|
90
|
-
const state = reactive({ count: 0, name: 'lyt' })
|
|
91
|
-
|
|
92
|
-
// 从存储恢复值到响应式对象
|
|
93
|
-
storage.restore(state, 'count', 0)
|
|
94
|
-
```
|
|
95
|
-
|
|
96
|
-
### 自定义序列化
|
|
97
|
-
|
|
98
|
-
```typescript
|
|
99
|
-
const storage = createStorage({
|
|
100
|
-
serialize: (value) => btoa(JSON.stringify(value)),
|
|
101
|
-
deserialize: (value) => JSON.parse(atob(value)),
|
|
102
|
-
})
|
|
103
|
-
```
|
|
104
|
-
|
|
105
|
-
## API
|
|
106
|
-
|
|
107
|
-
### Options
|
|
108
|
-
|
|
109
|
-
| 选项 | 类型 | 默认值 | 描述 |
|
|
110
|
-
|------|------|--------|------|
|
|
111
|
-
| `prefix` | `string` | `'lyt_'` | key 前缀,避免与其他应用冲突 |
|
|
112
|
-
| `storage` | `Storage` | `localStorage` | 使用的存储对象,可替换为 `sessionStorage` |
|
|
113
|
-
| `expire` | `number` | - | 全局过期时间(毫秒),默认无过期 |
|
|
114
|
-
| `debug` | `boolean` | `false` | 是否开启调试模式 |
|
|
115
|
-
| `serialize` | `(value: any) => string` | `JSON.stringify` | 数据序列化函数 |
|
|
116
|
-
| `deserialize` | `(value: string) => any` | `JSON.parse` | 数据反序列化函数 |
|
|
117
|
-
|
|
118
|
-
### 方法
|
|
119
|
-
|
|
120
|
-
| 方法 | 签名 | 描述 |
|
|
121
|
-
|------|------|------|
|
|
122
|
-
| `set` | `<T>(key: string, value: T, expire?: number) => void` | 设置值,支持单独设置过期时间 |
|
|
123
|
-
| `get` | `<T>(key: string, defaultValue?: T) => T \| null` | 获取值,过期自动返回 null |
|
|
124
|
-
| `remove` | `(key: string) => void` | 删除值 |
|
|
125
|
-
| `clear` | `() => void` | 清空所有当前前缀的存储项 |
|
|
126
|
-
| `has` | `(key: string) => boolean` | 检查 key 是否存在且未过期 |
|
|
127
|
-
| `keys` | `() => string[]` | 获取所有当前前缀的 key |
|
|
128
|
-
| `size` | `() => number` | 获取当前前缀的存储项数量 |
|
|
129
|
-
| `watch` | `(target: any, key: string, options?: WatchOptions) => () => void` | 监听响应式对象变化,自动保存 |
|
|
130
|
-
| `restore` | `<T>(target: any, key: string, defaultValue?: T) => T` | 从存储恢复响应式对象 |
|
|
131
|
-
|
|
132
|
-
### WatchOptions
|
|
133
|
-
|
|
134
|
-
| 选项 | 类型 | 默认值 | 描述 |
|
|
135
|
-
|------|------|--------|------|
|
|
136
|
-
| `immediate` | `boolean` | `true` | 是否立即执行一次保存 |
|
|
137
|
-
| `deep` | `boolean` | `true` | 是否深度监听 |
|
|
138
|
-
| `debounce` | `number` | `100` | 防抖延迟(毫秒) |
|
|
139
|
-
|
|
140
|
-
### 特性
|
|
141
|
-
|
|
142
|
-
- **前缀隔离**:通过 `prefix` 选项隔离不同应用的存储
|
|
143
|
-
- **自动过期**:支持全局和单 key 的过期时间设置
|
|
144
|
-
- **SSR 兼容**:localStorage 不可用时自动降级为内存存储
|
|
145
|
-
- **响应式集成**:支持监听响应式对象自动保存
|
|
146
|
-
|
|
147
|
-
## License
|
|
148
|
-
|
|
149
|
-
MIT
|
package/dist/types/index.d.ts
DELETED
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
/** 存储类型 */
|
|
2
|
-
type StorageType = 'local' | 'session';
|
|
3
|
-
/** 存储配置选项 */
|
|
4
|
-
interface StorageOptions {
|
|
5
|
-
/** key 前缀,默认 'lyt_' */
|
|
6
|
-
prefix?: string;
|
|
7
|
-
/** 使用的存储对象,默认 localStorage */
|
|
8
|
-
storage?: Storage;
|
|
9
|
-
/** 过期时间(毫秒),默认无过期 */
|
|
10
|
-
expire?: number;
|
|
11
|
-
/** 是否开启调试模式 */
|
|
12
|
-
debug?: boolean;
|
|
13
|
-
/** 数据序列化函数,默认 JSON.stringify */
|
|
14
|
-
serialize?: (value: any) => string;
|
|
15
|
-
/** 数据反序列化函数,默认 JSON.parse */
|
|
16
|
-
deserialize?: (value: string) => any;
|
|
17
|
-
}
|
|
18
|
-
/** 存储插件实例 */
|
|
19
|
-
interface StoragePlugin {
|
|
20
|
-
/** 安装到 Lyt 应用 */
|
|
21
|
-
install: (app: any, options?: any) => void;
|
|
22
|
-
/** 设置值 */
|
|
23
|
-
set<T = any>(key: string, value: T, expire?: number): void;
|
|
24
|
-
/** 获取值 */
|
|
25
|
-
get<T = any>(key: string, defaultValue?: T): T | null;
|
|
26
|
-
/** 删除值 */
|
|
27
|
-
remove(key: string): void;
|
|
28
|
-
/** 清空所有(仅当前前缀的) */
|
|
29
|
-
clear(): void;
|
|
30
|
-
/** 检查 key 是否存在 */
|
|
31
|
-
has(key: string): boolean;
|
|
32
|
-
/** 获取所有 key(仅当前前缀的) */
|
|
33
|
-
keys(): string[];
|
|
34
|
-
/** 获取存储使用情况 */
|
|
35
|
-
size(): number;
|
|
36
|
-
/** 监听响应式对象变化,自动保存 */
|
|
37
|
-
watch(target: any, key: string, options?: WatchOptions): () => void;
|
|
38
|
-
/** 从存储恢复响应式对象 */
|
|
39
|
-
restore<T = any>(target: any, key: string, defaultValue?: T): T;
|
|
40
|
-
/** 原始存储对象 */
|
|
41
|
-
readonly storage: Storage;
|
|
42
|
-
}
|
|
43
|
-
/** watch 配置选项 */
|
|
44
|
-
interface WatchOptions {
|
|
45
|
-
/** 是否立即执行一次保存 */
|
|
46
|
-
immediate?: boolean;
|
|
47
|
-
/** 深度监听 */
|
|
48
|
-
deep?: boolean;
|
|
49
|
-
/** 防抖延迟(毫秒) */
|
|
50
|
-
debounce?: number;
|
|
51
|
-
}
|
|
52
|
-
/**
|
|
53
|
-
* 创建本地存储持久化插件实例
|
|
54
|
-
* @param options 存储配置
|
|
55
|
-
* @returns StoragePlugin 插件实例
|
|
56
|
-
*/
|
|
57
|
-
declare function createStorage(options?: StorageOptions): StoragePlugin;
|
|
58
|
-
export { createStorage };
|
|
59
|
-
export type { StorageOptions, StoragePlugin, WatchOptions, StorageType };
|
|
60
|
-
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAeA,WAAW;AACX,KAAK,WAAW,GAAG,OAAO,GAAG,SAAS,CAAA;AAEtC,aAAa;AACb,UAAU,cAAc;IACtB,uBAAuB;IACvB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,8BAA8B;IAC9B,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,qBAAqB;IACrB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,eAAe;IACf,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,gCAAgC;IAChC,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,MAAM,CAAA;IAClC,6BAA6B;IAC7B,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,GAAG,CAAA;CACrC;AAYD,aAAa;AACb,UAAU,aAAa;IACrB,iBAAiB;IACjB,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,GAAG,KAAK,IAAI,CAAA;IAC1C,UAAU;IACV,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1D,UAAU;IACV,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,CAAA;IACrD,UAAU;IACV,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,mBAAmB;IACnB,KAAK,IAAI,IAAI,CAAA;IACb,kBAAkB;IAClB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;IACzB,uBAAuB;IACvB,IAAI,IAAI,MAAM,EAAE,CAAA;IAChB,eAAe;IACf,IAAI,IAAI,MAAM,CAAA;IACd,qBAAqB;IACrB,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,MAAM,IAAI,CAAA;IACnE,iBAAiB;IACjB,OAAO,CAAC,CAAC,GAAG,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC,CAAA;IAC/D,aAAa;IACb,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;CAC1B;AAED,iBAAiB;AACjB,UAAU,YAAY;IACpB,iBAAiB;IACjB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,WAAW;IACX,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,eAAe;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAoDD;;;;GAIG;AACH,iBAAS,aAAa,CAAC,OAAO,GAAE,cAAmB,GAAG,aAAa,CAgPlE;AAED,OAAO,EAAE,aAAa,EAAE,CAAA;AACxB,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,CAAA"}
|