@wcstack/storage 1.9.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.
@@ -0,0 +1,374 @@
1
+ const _config = {
2
+ autoTrigger: true,
3
+ triggerAttribute: "data-storagetarget",
4
+ tagNames: {
5
+ storage: "wcs-storage",
6
+ },
7
+ };
8
+ function deepFreeze(obj) {
9
+ if (obj === null || typeof obj !== "object")
10
+ return obj;
11
+ Object.freeze(obj);
12
+ for (const key of Object.keys(obj)) {
13
+ deepFreeze(obj[key]);
14
+ }
15
+ return obj;
16
+ }
17
+ function deepClone(obj) {
18
+ if (obj === null || typeof obj !== "object")
19
+ return obj;
20
+ const clone = {};
21
+ for (const key of Object.keys(obj)) {
22
+ clone[key] = deepClone(obj[key]);
23
+ }
24
+ return clone;
25
+ }
26
+ let frozenConfig = null;
27
+ const config = _config;
28
+ function getConfig() {
29
+ if (!frozenConfig) {
30
+ frozenConfig = deepFreeze(deepClone(_config));
31
+ }
32
+ return frozenConfig;
33
+ }
34
+ function setConfig(partialConfig) {
35
+ if (typeof partialConfig.autoTrigger === "boolean") {
36
+ _config.autoTrigger = partialConfig.autoTrigger;
37
+ }
38
+ if (typeof partialConfig.triggerAttribute === "string") {
39
+ _config.triggerAttribute = partialConfig.triggerAttribute;
40
+ }
41
+ if (partialConfig.tagNames) {
42
+ Object.assign(_config.tagNames, partialConfig.tagNames);
43
+ }
44
+ frozenConfig = null;
45
+ }
46
+
47
+ function raiseError(message) {
48
+ throw new Error(`[@wcstack/storage] ${message}`);
49
+ }
50
+
51
+ class StorageCore extends EventTarget {
52
+ static wcBindable = {
53
+ protocol: "wc-bindable",
54
+ version: 1,
55
+ properties: [
56
+ { name: "value", event: "wcs-storage:value-changed", getter: (e) => e.detail },
57
+ { name: "loading", event: "wcs-storage:loading-changed" },
58
+ { name: "error", event: "wcs-storage:error" },
59
+ ],
60
+ };
61
+ _target;
62
+ _value = null;
63
+ _loading = false;
64
+ _error = null;
65
+ _key = "";
66
+ _type = "local";
67
+ _storageListener = null;
68
+ constructor(target) {
69
+ super();
70
+ this._target = target ?? this;
71
+ }
72
+ get value() {
73
+ return this._value;
74
+ }
75
+ get loading() {
76
+ return this._loading;
77
+ }
78
+ get error() {
79
+ return this._error;
80
+ }
81
+ get key() {
82
+ return this._key;
83
+ }
84
+ set key(value) {
85
+ this._key = value;
86
+ }
87
+ get type() {
88
+ return this._type;
89
+ }
90
+ set type(value) {
91
+ if (value !== "local" && value !== "session") {
92
+ raiseError(`Invalid storage type: "${value}". Must be "local" or "session".`);
93
+ }
94
+ this._type = value;
95
+ }
96
+ _getStorage() {
97
+ return this._type === "session" ? sessionStorage : localStorage;
98
+ }
99
+ _setLoading(loading) {
100
+ this._loading = loading;
101
+ this._target.dispatchEvent(new CustomEvent("wcs-storage:loading-changed", {
102
+ detail: loading,
103
+ bubbles: true,
104
+ }));
105
+ }
106
+ _setError(error) {
107
+ this._error = error;
108
+ this._target.dispatchEvent(new CustomEvent("wcs-storage:error", {
109
+ detail: error,
110
+ bubbles: true,
111
+ }));
112
+ }
113
+ _setValue(value) {
114
+ this._value = value;
115
+ this._target.dispatchEvent(new CustomEvent("wcs-storage:value-changed", {
116
+ detail: value,
117
+ bubbles: true,
118
+ }));
119
+ }
120
+ load() {
121
+ if (!this._key) {
122
+ raiseError("key is required.");
123
+ }
124
+ this._setLoading(true);
125
+ this._setError(null);
126
+ try {
127
+ const storage = this._getStorage();
128
+ const raw = storage.getItem(this._key);
129
+ if (raw === null) {
130
+ this._setValue(null);
131
+ }
132
+ else {
133
+ try {
134
+ this._setValue(JSON.parse(raw));
135
+ }
136
+ catch {
137
+ this._setValue(raw);
138
+ }
139
+ }
140
+ this._setLoading(false);
141
+ return this._value;
142
+ }
143
+ catch (e) {
144
+ this._setError(e);
145
+ this._setLoading(false);
146
+ return null;
147
+ }
148
+ }
149
+ save(value) {
150
+ if (!this._key) {
151
+ raiseError("key is required.");
152
+ }
153
+ this._setLoading(true);
154
+ this._setError(null);
155
+ try {
156
+ const storage = this._getStorage();
157
+ if (value === null || value === undefined) {
158
+ storage.removeItem(this._key);
159
+ }
160
+ else if (typeof value === "string") {
161
+ storage.setItem(this._key, value);
162
+ }
163
+ else {
164
+ storage.setItem(this._key, JSON.stringify(value));
165
+ }
166
+ this._setValue(value);
167
+ this._setLoading(false);
168
+ }
169
+ catch (e) {
170
+ this._setError(e);
171
+ this._setLoading(false);
172
+ }
173
+ }
174
+ remove() {
175
+ if (!this._key) {
176
+ raiseError("key is required.");
177
+ }
178
+ this._setLoading(true);
179
+ this._setError(null);
180
+ try {
181
+ const storage = this._getStorage();
182
+ storage.removeItem(this._key);
183
+ this._setValue(null);
184
+ this._setLoading(false);
185
+ }
186
+ catch (e) {
187
+ this._setError(e);
188
+ this._setLoading(false);
189
+ }
190
+ }
191
+ startSync() {
192
+ if (this._storageListener)
193
+ return;
194
+ this._storageListener = (e) => {
195
+ if (e.key !== this._key)
196
+ return;
197
+ if (this._type === "session")
198
+ return;
199
+ if (e.newValue === null) {
200
+ this._setValue(null);
201
+ }
202
+ else {
203
+ try {
204
+ this._setValue(JSON.parse(e.newValue));
205
+ }
206
+ catch {
207
+ this._setValue(e.newValue);
208
+ }
209
+ }
210
+ };
211
+ globalThis.addEventListener("storage", this._storageListener);
212
+ }
213
+ stopSync() {
214
+ if (!this._storageListener)
215
+ return;
216
+ globalThis.removeEventListener("storage", this._storageListener);
217
+ this._storageListener = null;
218
+ }
219
+ }
220
+
221
+ let registered = false;
222
+ function handleClick(event) {
223
+ const target = event.target;
224
+ if (!(target instanceof Element))
225
+ return;
226
+ const triggerElement = target.closest(`[${config.triggerAttribute}]`);
227
+ if (!triggerElement)
228
+ return;
229
+ const storageId = triggerElement.getAttribute(config.triggerAttribute);
230
+ if (!storageId)
231
+ return;
232
+ const storageElement = document.getElementById(storageId);
233
+ if (!storageElement || !(storageElement instanceof Storage))
234
+ return;
235
+ event.preventDefault();
236
+ storageElement.save();
237
+ }
238
+ function registerAutoTrigger() {
239
+ if (registered)
240
+ return;
241
+ registered = true;
242
+ document.addEventListener("click", handleClick);
243
+ }
244
+
245
+ class Storage extends HTMLElement {
246
+ static hasConnectedCallbackPromise = true;
247
+ static wcBindable = {
248
+ ...StorageCore.wcBindable,
249
+ properties: [
250
+ ...StorageCore.wcBindable.properties,
251
+ { name: "trigger", event: "wcs-storage:trigger-changed" },
252
+ ],
253
+ };
254
+ static get observedAttributes() { return ["key", "type"]; }
255
+ _core;
256
+ _trigger = false;
257
+ _connectedCallbackPromise = Promise.resolve();
258
+ constructor() {
259
+ super();
260
+ this._core = new StorageCore(this);
261
+ }
262
+ get key() {
263
+ return this.getAttribute("key") || "";
264
+ }
265
+ set key(value) {
266
+ this.setAttribute("key", value);
267
+ }
268
+ get type() {
269
+ return this.getAttribute("type") || "local";
270
+ }
271
+ set type(value) {
272
+ this.setAttribute("type", value);
273
+ }
274
+ get value() {
275
+ return this._core.value;
276
+ }
277
+ set value(v) {
278
+ if (!this.manual) {
279
+ this._core.key = this.key;
280
+ this._core.type = this.type;
281
+ this._core.save(v);
282
+ }
283
+ }
284
+ get loading() {
285
+ return this._core.loading;
286
+ }
287
+ get error() {
288
+ return this._core.error;
289
+ }
290
+ get connectedCallbackPromise() {
291
+ return this._connectedCallbackPromise;
292
+ }
293
+ get manual() {
294
+ return this.hasAttribute("manual");
295
+ }
296
+ set manual(value) {
297
+ if (value) {
298
+ this.setAttribute("manual", "");
299
+ }
300
+ else {
301
+ this.removeAttribute("manual");
302
+ }
303
+ }
304
+ get trigger() {
305
+ return this._trigger;
306
+ }
307
+ set trigger(value) {
308
+ const v = !!value;
309
+ if (v) {
310
+ this._trigger = true;
311
+ this.save();
312
+ this._trigger = false;
313
+ this.dispatchEvent(new CustomEvent("wcs-storage:trigger-changed", {
314
+ detail: false,
315
+ bubbles: true,
316
+ }));
317
+ }
318
+ }
319
+ load() {
320
+ this._core.key = this.key;
321
+ this._core.type = this.type;
322
+ return this._core.load();
323
+ }
324
+ save() {
325
+ this._core.key = this.key;
326
+ this._core.type = this.type;
327
+ this._core.save(this._core.value);
328
+ }
329
+ remove() {
330
+ this._core.key = this.key;
331
+ this._core.type = this.type;
332
+ this._core.remove();
333
+ }
334
+ attributeChangedCallback(name, _oldValue, newValue) {
335
+ if (!this.isConnected)
336
+ return;
337
+ if (name === "key" && newValue && !this.manual) {
338
+ this.load();
339
+ }
340
+ if (name === "type") {
341
+ this._core.type = newValue || "local";
342
+ }
343
+ }
344
+ connectedCallback() {
345
+ this.style.display = "none";
346
+ if (config.autoTrigger) {
347
+ registerAutoTrigger();
348
+ }
349
+ if (!this.manual && this.key) {
350
+ this.load();
351
+ }
352
+ this._core.startSync();
353
+ this._connectedCallbackPromise = Promise.resolve();
354
+ }
355
+ disconnectedCallback() {
356
+ this._core.stopSync();
357
+ }
358
+ }
359
+
360
+ function registerComponents() {
361
+ if (!customElements.get(config.tagNames.storage)) {
362
+ customElements.define(config.tagNames.storage, Storage);
363
+ }
364
+ }
365
+
366
+ function bootstrapStorage(userConfig) {
367
+ if (userConfig) {
368
+ setConfig(userConfig);
369
+ }
370
+ registerComponents();
371
+ }
372
+
373
+ export { StorageCore, Storage as WcsStorage, bootstrapStorage, getConfig };
374
+ //# sourceMappingURL=index.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.esm.js","sources":["../src/config.ts","../src/raiseError.ts","../src/core/StorageCore.ts","../src/autoTrigger.ts","../src/components/Storage.ts","../src/registerComponents.ts","../src/bootstrapStorage.ts"],"sourcesContent":["import { IConfig, IWritableConfig } from \"./types.js\";\n\ninterface IInternalConfig extends IConfig {\n autoTrigger: boolean;\n triggerAttribute: string;\n tagNames: {\n storage: string;\n };\n}\n\nconst _config: IInternalConfig = {\n autoTrigger: true,\n triggerAttribute: \"data-storagetarget\",\n tagNames: {\n storage: \"wcs-storage\",\n },\n};\n\nfunction deepFreeze<T>(obj: T): T {\n if (obj === null || typeof obj !== \"object\") return obj;\n Object.freeze(obj);\n for (const key of Object.keys(obj)) {\n deepFreeze((obj as Record<string, unknown>)[key]);\n }\n return obj;\n}\n\nfunction deepClone<T>(obj: T): T {\n if (obj === null || typeof obj !== \"object\") return obj;\n const clone: Record<string, unknown> = {};\n for (const key of Object.keys(obj)) {\n clone[key] = deepClone((obj as Record<string, unknown>)[key]);\n }\n return clone as T;\n}\n\nlet frozenConfig: IConfig | null = null;\n\nexport const config: IConfig = _config as IConfig;\n\nexport function getConfig(): IConfig {\n if (!frozenConfig) {\n frozenConfig = deepFreeze(deepClone(_config));\n }\n return frozenConfig;\n}\n\nexport function setConfig(partialConfig: IWritableConfig): void {\n if (typeof partialConfig.autoTrigger === \"boolean\") {\n _config.autoTrigger = partialConfig.autoTrigger;\n }\n if (typeof partialConfig.triggerAttribute === \"string\") {\n _config.triggerAttribute = partialConfig.triggerAttribute;\n }\n if (partialConfig.tagNames) {\n Object.assign(_config.tagNames, partialConfig.tagNames);\n }\n frozenConfig = null;\n}\n","export function raiseError(message: string): never {\n throw new Error(`[@wcstack/storage] ${message}`);\n}\n","import { raiseError } from \"../raiseError.js\";\nimport { IWcBindable, StorageType } from \"../types.js\";\n\nexport class StorageCore extends EventTarget {\n static wcBindable: IWcBindable = {\n protocol: \"wc-bindable\",\n version: 1,\n properties: [\n { name: \"value\", event: \"wcs-storage:value-changed\", getter: (e: Event) => (e as CustomEvent).detail },\n { name: \"loading\", event: \"wcs-storage:loading-changed\" },\n { name: \"error\", event: \"wcs-storage:error\" },\n ],\n };\n\n private _target: EventTarget;\n private _value: any = null;\n private _loading: boolean = false;\n private _error: any = null;\n private _key: string = \"\";\n private _type: StorageType = \"local\";\n private _storageListener: ((e: StorageEvent) => void) | null = null;\n\n constructor(target?: EventTarget) {\n super();\n this._target = target ?? this;\n }\n\n get value(): any {\n return this._value;\n }\n\n get loading(): boolean {\n return this._loading;\n }\n\n get error(): any {\n return this._error;\n }\n\n get key(): string {\n return this._key;\n }\n\n set key(value: string) {\n this._key = value;\n }\n\n get type(): StorageType {\n return this._type;\n }\n\n set type(value: StorageType) {\n if (value !== \"local\" && value !== \"session\") {\n raiseError(`Invalid storage type: \"${value}\". Must be \"local\" or \"session\".`);\n }\n this._type = value;\n }\n\n private _getStorage(): globalThis.Storage {\n return this._type === \"session\" ? sessionStorage : localStorage;\n }\n\n private _setLoading(loading: boolean): void {\n this._loading = loading;\n this._target.dispatchEvent(new CustomEvent(\"wcs-storage:loading-changed\", {\n detail: loading,\n bubbles: true,\n }));\n }\n\n private _setError(error: any): void {\n this._error = error;\n this._target.dispatchEvent(new CustomEvent(\"wcs-storage:error\", {\n detail: error,\n bubbles: true,\n }));\n }\n\n private _setValue(value: any): void {\n this._value = value;\n this._target.dispatchEvent(new CustomEvent(\"wcs-storage:value-changed\", {\n detail: value,\n bubbles: true,\n }));\n }\n\n load(): any {\n if (!this._key) {\n raiseError(\"key is required.\");\n }\n\n this._setLoading(true);\n this._setError(null);\n\n try {\n const storage = this._getStorage();\n const raw = storage.getItem(this._key);\n\n if (raw === null) {\n this._setValue(null);\n } else {\n try {\n this._setValue(JSON.parse(raw));\n } catch {\n this._setValue(raw);\n }\n }\n\n this._setLoading(false);\n return this._value;\n } catch (e: any) {\n this._setError(e);\n this._setLoading(false);\n return null;\n }\n }\n\n save(value: any): void {\n if (!this._key) {\n raiseError(\"key is required.\");\n }\n\n this._setLoading(true);\n this._setError(null);\n\n try {\n const storage = this._getStorage();\n\n if (value === null || value === undefined) {\n storage.removeItem(this._key);\n } else if (typeof value === \"string\") {\n storage.setItem(this._key, value);\n } else {\n storage.setItem(this._key, JSON.stringify(value));\n }\n\n this._setValue(value);\n this._setLoading(false);\n } catch (e: any) {\n this._setError(e);\n this._setLoading(false);\n }\n }\n\n remove(): void {\n if (!this._key) {\n raiseError(\"key is required.\");\n }\n\n this._setLoading(true);\n this._setError(null);\n\n try {\n const storage = this._getStorage();\n storage.removeItem(this._key);\n this._setValue(null);\n this._setLoading(false);\n } catch (e: any) {\n this._setError(e);\n this._setLoading(false);\n }\n }\n\n startSync(): void {\n if (this._storageListener) return;\n\n this._storageListener = (e: StorageEvent) => {\n if (e.key !== this._key) return;\n if (this._type === \"session\") return;\n\n if (e.newValue === null) {\n this._setValue(null);\n } else {\n try {\n this._setValue(JSON.parse(e.newValue));\n } catch {\n this._setValue(e.newValue);\n }\n }\n };\n\n globalThis.addEventListener(\"storage\", this._storageListener);\n }\n\n stopSync(): void {\n if (!this._storageListener) return;\n globalThis.removeEventListener(\"storage\", this._storageListener);\n this._storageListener = null;\n }\n}\n","import { config } from \"./config.js\";\nimport { Storage } from \"./components/Storage.js\";\n\nlet registered = false;\n\nfunction handleClick(event: Event): void {\n const target = event.target;\n if (!(target instanceof Element)) return;\n\n const triggerElement = target.closest<Element>(`[${config.triggerAttribute}]`);\n if (!triggerElement) return;\n\n const storageId = triggerElement.getAttribute(config.triggerAttribute);\n if (!storageId) return;\n\n const storageElement = document.getElementById(storageId) as Storage | null;\n if (!storageElement || !(storageElement instanceof Storage)) return;\n\n event.preventDefault();\n storageElement.save();\n}\n\nexport function registerAutoTrigger(): void {\n if (registered) return;\n registered = true;\n document.addEventListener(\"click\", handleClick);\n}\n\nexport function unregisterAutoTrigger(): void {\n if (!registered) return;\n registered = false;\n document.removeEventListener(\"click\", handleClick);\n}\n","import { config } from \"../config.js\";\nimport { IWcBindable, StorageType } from \"../types.js\";\nimport { StorageCore } from \"../core/StorageCore.js\";\nimport { registerAutoTrigger } from \"../autoTrigger.js\";\n\nexport class Storage extends HTMLElement {\n static hasConnectedCallbackPromise = true;\n static wcBindable: IWcBindable = {\n ...StorageCore.wcBindable,\n properties: [\n ...StorageCore.wcBindable.properties,\n { name: \"trigger\", event: \"wcs-storage:trigger-changed\" },\n ],\n };\n static get observedAttributes(): string[] { return [\"key\", \"type\"]; }\n\n private _core: StorageCore;\n private _trigger: boolean = false;\n private _connectedCallbackPromise: Promise<void> = Promise.resolve();\n\n constructor() {\n super();\n this._core = new StorageCore(this);\n }\n\n get key(): string {\n return this.getAttribute(\"key\") || \"\";\n }\n\n set key(value: string) {\n this.setAttribute(\"key\", value);\n }\n\n get type(): StorageType {\n return (this.getAttribute(\"type\") as StorageType) || \"local\";\n }\n\n set type(value: StorageType) {\n this.setAttribute(\"type\", value);\n }\n\n get value(): any {\n return this._core.value;\n }\n\n set value(v: any) {\n if (!this.manual) {\n this._core.key = this.key;\n this._core.type = this.type;\n this._core.save(v);\n }\n }\n\n get loading(): boolean {\n return this._core.loading;\n }\n\n get error(): any {\n return this._core.error;\n }\n\n get connectedCallbackPromise(): Promise<void> {\n return this._connectedCallbackPromise;\n }\n\n get manual(): boolean {\n return this.hasAttribute(\"manual\");\n }\n\n set manual(value: boolean) {\n if (value) {\n this.setAttribute(\"manual\", \"\");\n } else {\n this.removeAttribute(\"manual\");\n }\n }\n\n get trigger(): boolean {\n return this._trigger;\n }\n\n set trigger(value: boolean) {\n const v = !!value;\n if (v) {\n this._trigger = true;\n this.save();\n this._trigger = false;\n this.dispatchEvent(new CustomEvent(\"wcs-storage:trigger-changed\", {\n detail: false,\n bubbles: true,\n }));\n }\n }\n\n load(): any {\n this._core.key = this.key;\n this._core.type = this.type;\n return this._core.load();\n }\n\n save(): void {\n this._core.key = this.key;\n this._core.type = this.type;\n this._core.save(this._core.value);\n }\n\n remove(): void {\n this._core.key = this.key;\n this._core.type = this.type;\n this._core.remove();\n }\n\n attributeChangedCallback(name: string, _oldValue: string | null, newValue: string | null): void {\n if (!this.isConnected) return;\n if (name === \"key\" && newValue && !this.manual) {\n this.load();\n }\n if (name === \"type\") {\n this._core.type = (newValue as StorageType) || \"local\";\n }\n }\n\n connectedCallback(): void {\n this.style.display = \"none\";\n if (config.autoTrigger) {\n registerAutoTrigger();\n }\n if (!this.manual && this.key) {\n this.load();\n }\n this._core.startSync();\n this._connectedCallbackPromise = Promise.resolve();\n }\n\n disconnectedCallback(): void {\n this._core.stopSync();\n }\n}\n","import { Storage } from \"./components/Storage.js\";\nimport { config } from \"./config.js\";\n\nexport function registerComponents(): void {\n if (!customElements.get(config.tagNames.storage)) {\n customElements.define(config.tagNames.storage, Storage);\n }\n}\n","import { setConfig } from \"./config.js\";\nimport { registerComponents } from \"./registerComponents.js\";\nimport { IWritableConfig } from \"./types.js\";\n\nexport function bootstrapStorage(userConfig?: IWritableConfig): void {\n if (userConfig) {\n setConfig(userConfig);\n }\n registerComponents();\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ const e={autoTrigger:!0,triggerAttribute:"data-storagetarget",tagNames:{storage:"wcs-storage"}};function t(e){if(null===e||"object"!=typeof e)return e;Object.freeze(e);for(const s of Object.keys(e))t(e[s]);return e}function s(e){if(null===e||"object"!=typeof e)return e;const t={};for(const r of Object.keys(e))t[r]=s(e[r]);return t}let r=null;const i=e;function a(){return r||(r=t(s(e))),r}function n(e){throw new Error(`[@wcstack/storage] ${e}`)}class o extends EventTarget{static wcBindable={protocol:"wc-bindable",version:1,properties:[{name:"value",event:"wcs-storage:value-changed",getter:e=>e.detail},{name:"loading",event:"wcs-storage:loading-changed"},{name:"error",event:"wcs-storage:error"}]};_target;_value=null;_loading=!1;_error=null;_key="";_type="local";_storageListener=null;constructor(e){super(),this._target=e??this}get value(){return this._value}get loading(){return this._loading}get error(){return this._error}get key(){return this._key}set key(e){this._key=e}get type(){return this._type}set type(e){"local"!==e&&"session"!==e&&n(`Invalid storage type: "${e}". Must be "local" or "session".`),this._type=e}_getStorage(){return"session"===this._type?sessionStorage:localStorage}_setLoading(e){this._loading=e,this._target.dispatchEvent(new CustomEvent("wcs-storage:loading-changed",{detail:e,bubbles:!0}))}_setError(e){this._error=e,this._target.dispatchEvent(new CustomEvent("wcs-storage:error",{detail:e,bubbles:!0}))}_setValue(e){this._value=e,this._target.dispatchEvent(new CustomEvent("wcs-storage:value-changed",{detail:e,bubbles:!0}))}load(){this._key||n("key is required."),this._setLoading(!0),this._setError(null);try{const e=this._getStorage().getItem(this._key);if(null===e)this._setValue(null);else try{this._setValue(JSON.parse(e))}catch{this._setValue(e)}return this._setLoading(!1),this._value}catch(e){return this._setError(e),this._setLoading(!1),null}}save(e){this._key||n("key is required."),this._setLoading(!0),this._setError(null);try{const t=this._getStorage();null==e?t.removeItem(this._key):"string"==typeof e?t.setItem(this._key,e):t.setItem(this._key,JSON.stringify(e)),this._setValue(e),this._setLoading(!1)}catch(e){this._setError(e),this._setLoading(!1)}}remove(){this._key||n("key is required."),this._setLoading(!0),this._setError(null);try{this._getStorage().removeItem(this._key),this._setValue(null),this._setLoading(!1)}catch(e){this._setError(e),this._setLoading(!1)}}startSync(){this._storageListener||(this._storageListener=e=>{if(e.key===this._key&&"session"!==this._type)if(null===e.newValue)this._setValue(null);else try{this._setValue(JSON.parse(e.newValue))}catch{this._setValue(e.newValue)}},globalThis.addEventListener("storage",this._storageListener))}stopSync(){this._storageListener&&(globalThis.removeEventListener("storage",this._storageListener),this._storageListener=null)}}let l=!1;function g(e){const t=e.target;if(!(t instanceof Element))return;const s=t.closest(`[${i.triggerAttribute}]`);if(!s)return;const r=s.getAttribute(i.triggerAttribute);if(!r)return;const a=document.getElementById(r);a&&a instanceof c&&(e.preventDefault(),a.save())}class c extends HTMLElement{static hasConnectedCallbackPromise=!0;static wcBindable={...o.wcBindable,properties:[...o.wcBindable.properties,{name:"trigger",event:"wcs-storage:trigger-changed"}]};static get observedAttributes(){return["key","type"]}_core;_trigger=!1;_connectedCallbackPromise=Promise.resolve();constructor(){super(),this._core=new o(this)}get key(){return this.getAttribute("key")||""}set key(e){this.setAttribute("key",e)}get type(){return this.getAttribute("type")||"local"}set type(e){this.setAttribute("type",e)}get value(){return this._core.value}set value(e){this.manual||(this._core.key=this.key,this._core.type=this.type,this._core.save(e))}get loading(){return this._core.loading}get error(){return this._core.error}get connectedCallbackPromise(){return this._connectedCallbackPromise}get manual(){return this.hasAttribute("manual")}set manual(e){e?this.setAttribute("manual",""):this.removeAttribute("manual")}get trigger(){return this._trigger}set trigger(e){!!e&&(this._trigger=!0,this.save(),this._trigger=!1,this.dispatchEvent(new CustomEvent("wcs-storage:trigger-changed",{detail:!1,bubbles:!0})))}load(){return this._core.key=this.key,this._core.type=this.type,this._core.load()}save(){this._core.key=this.key,this._core.type=this.type,this._core.save(this._core.value)}remove(){this._core.key=this.key,this._core.type=this.type,this._core.remove()}attributeChangedCallback(e,t,s){this.isConnected&&("key"===e&&s&&!this.manual&&this.load(),"type"===e&&(this._core.type=s||"local"))}connectedCallback(){this.style.display="none",i.autoTrigger&&(l||(l=!0,document.addEventListener("click",g))),!this.manual&&this.key&&this.load(),this._core.startSync(),this._connectedCallbackPromise=Promise.resolve()}disconnectedCallback(){this._core.stopSync()}}function h(t){var s;t&&("boolean"==typeof(s=t).autoTrigger&&(e.autoTrigger=s.autoTrigger),"string"==typeof s.triggerAttribute&&(e.triggerAttribute=s.triggerAttribute),s.tagNames&&Object.assign(e.tagNames,s.tagNames),r=null),customElements.get(i.tagNames.storage)||customElements.define(i.tagNames.storage,c)}export{o as StorageCore,c as WcsStorage,h as bootstrapStorage,a as getConfig};
2
+ //# sourceMappingURL=index.esm.min.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.esm.min.js","sources":["../src/config.ts","../src/raiseError.ts","../src/core/StorageCore.ts","../src/autoTrigger.ts","../src/components/Storage.ts","../src/bootstrapStorage.ts","../src/registerComponents.ts"],"sourcesContent":["import { IConfig, IWritableConfig } from \"./types.js\";\n\ninterface IInternalConfig extends IConfig {\n autoTrigger: boolean;\n triggerAttribute: string;\n tagNames: {\n storage: string;\n };\n}\n\nconst _config: IInternalConfig = {\n autoTrigger: true,\n triggerAttribute: \"data-storagetarget\",\n tagNames: {\n storage: \"wcs-storage\",\n },\n};\n\nfunction deepFreeze<T>(obj: T): T {\n if (obj === null || typeof obj !== \"object\") return obj;\n Object.freeze(obj);\n for (const key of Object.keys(obj)) {\n deepFreeze((obj as Record<string, unknown>)[key]);\n }\n return obj;\n}\n\nfunction deepClone<T>(obj: T): T {\n if (obj === null || typeof obj !== \"object\") return obj;\n const clone: Record<string, unknown> = {};\n for (const key of Object.keys(obj)) {\n clone[key] = deepClone((obj as Record<string, unknown>)[key]);\n }\n return clone as T;\n}\n\nlet frozenConfig: IConfig | null = null;\n\nexport const config: IConfig = _config as IConfig;\n\nexport function getConfig(): IConfig {\n if (!frozenConfig) {\n frozenConfig = deepFreeze(deepClone(_config));\n }\n return frozenConfig;\n}\n\nexport function setConfig(partialConfig: IWritableConfig): void {\n if (typeof partialConfig.autoTrigger === \"boolean\") {\n _config.autoTrigger = partialConfig.autoTrigger;\n }\n if (typeof partialConfig.triggerAttribute === \"string\") {\n _config.triggerAttribute = partialConfig.triggerAttribute;\n }\n if (partialConfig.tagNames) {\n Object.assign(_config.tagNames, partialConfig.tagNames);\n }\n frozenConfig = null;\n}\n","export function raiseError(message: string): never {\n throw new Error(`[@wcstack/storage] ${message}`);\n}\n","import { raiseError } from \"../raiseError.js\";\nimport { IWcBindable, StorageType } from \"../types.js\";\n\nexport class StorageCore extends EventTarget {\n static wcBindable: IWcBindable = {\n protocol: \"wc-bindable\",\n version: 1,\n properties: [\n { name: \"value\", event: \"wcs-storage:value-changed\", getter: (e: Event) => (e as CustomEvent).detail },\n { name: \"loading\", event: \"wcs-storage:loading-changed\" },\n { name: \"error\", event: \"wcs-storage:error\" },\n ],\n };\n\n private _target: EventTarget;\n private _value: any = null;\n private _loading: boolean = false;\n private _error: any = null;\n private _key: string = \"\";\n private _type: StorageType = \"local\";\n private _storageListener: ((e: StorageEvent) => void) | null = null;\n\n constructor(target?: EventTarget) {\n super();\n this._target = target ?? this;\n }\n\n get value(): any {\n return this._value;\n }\n\n get loading(): boolean {\n return this._loading;\n }\n\n get error(): any {\n return this._error;\n }\n\n get key(): string {\n return this._key;\n }\n\n set key(value: string) {\n this._key = value;\n }\n\n get type(): StorageType {\n return this._type;\n }\n\n set type(value: StorageType) {\n if (value !== \"local\" && value !== \"session\") {\n raiseError(`Invalid storage type: \"${value}\". Must be \"local\" or \"session\".`);\n }\n this._type = value;\n }\n\n private _getStorage(): globalThis.Storage {\n return this._type === \"session\" ? sessionStorage : localStorage;\n }\n\n private _setLoading(loading: boolean): void {\n this._loading = loading;\n this._target.dispatchEvent(new CustomEvent(\"wcs-storage:loading-changed\", {\n detail: loading,\n bubbles: true,\n }));\n }\n\n private _setError(error: any): void {\n this._error = error;\n this._target.dispatchEvent(new CustomEvent(\"wcs-storage:error\", {\n detail: error,\n bubbles: true,\n }));\n }\n\n private _setValue(value: any): void {\n this._value = value;\n this._target.dispatchEvent(new CustomEvent(\"wcs-storage:value-changed\", {\n detail: value,\n bubbles: true,\n }));\n }\n\n load(): any {\n if (!this._key) {\n raiseError(\"key is required.\");\n }\n\n this._setLoading(true);\n this._setError(null);\n\n try {\n const storage = this._getStorage();\n const raw = storage.getItem(this._key);\n\n if (raw === null) {\n this._setValue(null);\n } else {\n try {\n this._setValue(JSON.parse(raw));\n } catch {\n this._setValue(raw);\n }\n }\n\n this._setLoading(false);\n return this._value;\n } catch (e: any) {\n this._setError(e);\n this._setLoading(false);\n return null;\n }\n }\n\n save(value: any): void {\n if (!this._key) {\n raiseError(\"key is required.\");\n }\n\n this._setLoading(true);\n this._setError(null);\n\n try {\n const storage = this._getStorage();\n\n if (value === null || value === undefined) {\n storage.removeItem(this._key);\n } else if (typeof value === \"string\") {\n storage.setItem(this._key, value);\n } else {\n storage.setItem(this._key, JSON.stringify(value));\n }\n\n this._setValue(value);\n this._setLoading(false);\n } catch (e: any) {\n this._setError(e);\n this._setLoading(false);\n }\n }\n\n remove(): void {\n if (!this._key) {\n raiseError(\"key is required.\");\n }\n\n this._setLoading(true);\n this._setError(null);\n\n try {\n const storage = this._getStorage();\n storage.removeItem(this._key);\n this._setValue(null);\n this._setLoading(false);\n } catch (e: any) {\n this._setError(e);\n this._setLoading(false);\n }\n }\n\n startSync(): void {\n if (this._storageListener) return;\n\n this._storageListener = (e: StorageEvent) => {\n if (e.key !== this._key) return;\n if (this._type === \"session\") return;\n\n if (e.newValue === null) {\n this._setValue(null);\n } else {\n try {\n this._setValue(JSON.parse(e.newValue));\n } catch {\n this._setValue(e.newValue);\n }\n }\n };\n\n globalThis.addEventListener(\"storage\", this._storageListener);\n }\n\n stopSync(): void {\n if (!this._storageListener) return;\n globalThis.removeEventListener(\"storage\", this._storageListener);\n this._storageListener = null;\n }\n}\n","import { config } from \"./config.js\";\nimport { Storage } from \"./components/Storage.js\";\n\nlet registered = false;\n\nfunction handleClick(event: Event): void {\n const target = event.target;\n if (!(target instanceof Element)) return;\n\n const triggerElement = target.closest<Element>(`[${config.triggerAttribute}]`);\n if (!triggerElement) return;\n\n const storageId = triggerElement.getAttribute(config.triggerAttribute);\n if (!storageId) return;\n\n const storageElement = document.getElementById(storageId) as Storage | null;\n if (!storageElement || !(storageElement instanceof Storage)) return;\n\n event.preventDefault();\n storageElement.save();\n}\n\nexport function registerAutoTrigger(): void {\n if (registered) return;\n registered = true;\n document.addEventListener(\"click\", handleClick);\n}\n\nexport function unregisterAutoTrigger(): void {\n if (!registered) return;\n registered = false;\n document.removeEventListener(\"click\", handleClick);\n}\n","import { config } from \"../config.js\";\nimport { IWcBindable, StorageType } from \"../types.js\";\nimport { StorageCore } from \"../core/StorageCore.js\";\nimport { registerAutoTrigger } from \"../autoTrigger.js\";\n\nexport class Storage extends HTMLElement {\n static hasConnectedCallbackPromise = true;\n static wcBindable: IWcBindable = {\n ...StorageCore.wcBindable,\n properties: [\n ...StorageCore.wcBindable.properties,\n { name: \"trigger\", event: \"wcs-storage:trigger-changed\" },\n ],\n };\n static get observedAttributes(): string[] { return [\"key\", \"type\"]; }\n\n private _core: StorageCore;\n private _trigger: boolean = false;\n private _connectedCallbackPromise: Promise<void> = Promise.resolve();\n\n constructor() {\n super();\n this._core = new StorageCore(this);\n }\n\n get key(): string {\n return this.getAttribute(\"key\") || \"\";\n }\n\n set key(value: string) {\n this.setAttribute(\"key\", value);\n }\n\n get type(): StorageType {\n return (this.getAttribute(\"type\") as StorageType) || \"local\";\n }\n\n set type(value: StorageType) {\n this.setAttribute(\"type\", value);\n }\n\n get value(): any {\n return this._core.value;\n }\n\n set value(v: any) {\n if (!this.manual) {\n this._core.key = this.key;\n this._core.type = this.type;\n this._core.save(v);\n }\n }\n\n get loading(): boolean {\n return this._core.loading;\n }\n\n get error(): any {\n return this._core.error;\n }\n\n get connectedCallbackPromise(): Promise<void> {\n return this._connectedCallbackPromise;\n }\n\n get manual(): boolean {\n return this.hasAttribute(\"manual\");\n }\n\n set manual(value: boolean) {\n if (value) {\n this.setAttribute(\"manual\", \"\");\n } else {\n this.removeAttribute(\"manual\");\n }\n }\n\n get trigger(): boolean {\n return this._trigger;\n }\n\n set trigger(value: boolean) {\n const v = !!value;\n if (v) {\n this._trigger = true;\n this.save();\n this._trigger = false;\n this.dispatchEvent(new CustomEvent(\"wcs-storage:trigger-changed\", {\n detail: false,\n bubbles: true,\n }));\n }\n }\n\n load(): any {\n this._core.key = this.key;\n this._core.type = this.type;\n return this._core.load();\n }\n\n save(): void {\n this._core.key = this.key;\n this._core.type = this.type;\n this._core.save(this._core.value);\n }\n\n remove(): void {\n this._core.key = this.key;\n this._core.type = this.type;\n this._core.remove();\n }\n\n attributeChangedCallback(name: string, _oldValue: string | null, newValue: string | null): void {\n if (!this.isConnected) return;\n if (name === \"key\" && newValue && !this.manual) {\n this.load();\n }\n if (name === \"type\") {\n this._core.type = (newValue as StorageType) || \"local\";\n }\n }\n\n connectedCallback(): void {\n this.style.display = \"none\";\n if (config.autoTrigger) {\n registerAutoTrigger();\n }\n if (!this.manual && this.key) {\n this.load();\n }\n this._core.startSync();\n this._connectedCallbackPromise = Promise.resolve();\n }\n\n disconnectedCallback(): void {\n this._core.stopSync();\n }\n}\n","import { setConfig } from \"./config.js\";\nimport { registerComponents } from \"./registerComponents.js\";\nimport { IWritableConfig } from \"./types.js\";\n\nexport function bootstrapStorage(userConfig?: IWritableConfig): void {\n if (userConfig) {\n setConfig(userConfig);\n }\n registerComponents();\n}\n","import { Storage } from \"./components/Storage.js\";\nimport { config } from \"./config.js\";\n\nexport function registerComponents(): void {\n if (!customElements.get(config.tagNames.storage)) {\n customElements.define(config.tagNames.storage, Storage);\n }\n}\n"],"names":["_config","autoTrigger","triggerAttribute","tagNames","storage","deepFreeze","obj","Object","freeze","key","keys","deepClone","clone","frozenConfig","config","getConfig","raiseError","message","Error","StorageCore","EventTarget","static","protocol","version","properties","name","event","getter","e","detail","_target","_value","_loading","_error","_key","_type","_storageListener","constructor","target","super","this","value","loading","error","type","_getStorage","sessionStorage","localStorage","_setLoading","dispatchEvent","CustomEvent","bubbles","_setError","_setValue","load","raw","getItem","JSON","parse","save","removeItem","setItem","stringify","remove","startSync","newValue","globalThis","addEventListener","stopSync","removeEventListener","registered","handleClick","Element","triggerElement","closest","storageId","getAttribute","storageElement","document","getElementById","Storage","preventDefault","HTMLElement","wcBindable","observedAttributes","_core","_trigger","_connectedCallbackPromise","Promise","resolve","setAttribute","v","manual","connectedCallbackPromise","hasAttribute","removeAttribute","trigger","attributeChangedCallback","_oldValue","isConnected","connectedCallback","style","display","disconnectedCallback","bootstrapStorage","userConfig","partialConfig","assign","customElements","get","define"],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,72 @@
1
+ {
2
+ "name": "@wcstack/storage",
3
+ "version": "1.9.0",
4
+ "description": "Declarative persistent storage component for Web Components. Framework-agnostic localStorage/sessionStorage via wc-bindable-protocol.",
5
+ "type": "module",
6
+ "main": "./dist/index.esm.js",
7
+ "module": "./dist/index.esm.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.esm.js"
13
+ },
14
+ "./auto": "./dist/auto.min.js"
15
+ },
16
+ "files": [
17
+ "dist"
18
+ ],
19
+ "scripts": {
20
+ "clean": "rimraf dist .tsc-out",
21
+ "build": "rimraf dist .tsc-out && tsc && rollup -c",
22
+ "test": "vitest run",
23
+ "test:watch": "vitest",
24
+ "test:coverage": "vitest run --coverage",
25
+ "lint": "eslint src",
26
+ "version:patch": "npm version patch",
27
+ "version:minor": "npm version minor",
28
+ "version:major": "npm version major",
29
+ "prepublishOnly": "npm run build && npm run test:coverage"
30
+ },
31
+ "keywords": [
32
+ "web-components",
33
+ "storage",
34
+ "localStorage",
35
+ "sessionStorage",
36
+ "custom-elements",
37
+ "wc-bindable",
38
+ "declarative",
39
+ "persistent",
40
+ "zero-dependencies",
41
+ "framework-agnostic"
42
+ ],
43
+ "author": "mogera551",
44
+ "homepage": "https://wcstack.github.io",
45
+ "repository": {
46
+ "type": "git",
47
+ "url": "https://github.com/wcstack/wcstack.git",
48
+ "directory": "packages/storage"
49
+ },
50
+ "bugs": {
51
+ "url": "https://github.com/wcstack/wcstack/issues"
52
+ },
53
+ "license": "MIT",
54
+ "devDependencies": {
55
+ "@eslint/js": "^9.39.1",
56
+ "@rollup/plugin-terser": "^0.4.4",
57
+ "@rollup/plugin-typescript": "^11.1.6",
58
+ "@vitest/coverage-v8": "^4.0.15",
59
+ "@vitest/ui": "^4.0.15",
60
+ "eslint": "^9.39.1",
61
+ "globals": "^16.5.0",
62
+ "happy-dom": "^20.0.11",
63
+ "rimraf": "^6.0.1",
64
+ "rollup": "^4.22.4",
65
+ "rollup-plugin-dts": "^6.1.1",
66
+ "rollup-plugin-copy": "^3.5.0",
67
+ "tslib": "^2.8.1",
68
+ "typescript": "^5.9.3",
69
+ "typescript-eslint": "^8.49.0",
70
+ "vitest": "^4.0.15"
71
+ }
72
+ }