@cocreate/local-storage 1.16.0 → 1.16.2
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 +18 -0
- package/docs/index.html +329 -337
- package/package.json +6 -10
- package/src/index.js +242 -229
- package/webpack.config.js +65 -90
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cocreate/local-storage",
|
|
3
|
-
"version": "1.16.
|
|
3
|
+
"version": "1.16.2",
|
|
4
4
|
"description": "A Simple component similar to CoCreate-input & CoCreate-fetch which Save and fetch data for inputs, textarea, selects from localstorage. Easily configured using HTML5 attributes and/or JavaScript API",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"local-storage",
|
|
@@ -45,20 +45,16 @@
|
|
|
45
45
|
},
|
|
46
46
|
"main": "./src/index.js",
|
|
47
47
|
"devDependencies": {
|
|
48
|
-
"
|
|
49
|
-
"
|
|
50
|
-
"
|
|
51
|
-
"clean-webpack-plugin": "^3.0.0",
|
|
52
|
-
"file-loader": "^6.2.0",
|
|
48
|
+
"css-loader": "^5.1.3",
|
|
49
|
+
"esbuild": "^0.25.2",
|
|
50
|
+
"esbuild-loader": "^4.3.0",
|
|
53
51
|
"mini-css-extract-plugin": "^1.5.0",
|
|
54
|
-
"style-loader": "^3.3.1",
|
|
55
|
-
"terser-webpack-plugin": "^5.1.1",
|
|
56
52
|
"webpack": "^5.24.4",
|
|
57
53
|
"webpack-cli": "^4.5.0",
|
|
58
54
|
"webpack-log": "^3.0.1"
|
|
59
55
|
},
|
|
60
56
|
"dependencies": {
|
|
61
|
-
"@cocreate/actions": "^1.
|
|
62
|
-
"@cocreate/observer": "^1.
|
|
57
|
+
"@cocreate/actions": "^1.21.0",
|
|
58
|
+
"@cocreate/observer": "^1.18.0"
|
|
63
59
|
}
|
|
64
60
|
}
|
package/src/index.js
CHANGED
|
@@ -1,234 +1,247 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
1
|
+
import Observer from "@cocreate/observer";
|
|
2
|
+
import Actions from "@cocreate/actions";
|
|
3
3
|
|
|
4
4
|
const CoCreateLocalStorage = {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
5
|
+
support: true,
|
|
6
|
+
storage: new Map(),
|
|
7
|
+
|
|
8
|
+
init: function () {
|
|
9
|
+
const self = this;
|
|
10
|
+
var elements = document.querySelectorAll(
|
|
11
|
+
"[localstorage-set], [localstorage-get]"
|
|
12
|
+
);
|
|
13
|
+
this.initElements(elements);
|
|
14
|
+
|
|
15
|
+
window.addEventListener("storage", function (e) {
|
|
16
|
+
elements = document.querySelectorAll(
|
|
17
|
+
`[localstorage-get="${e.key}"]`
|
|
18
|
+
);
|
|
19
|
+
for (let element of elements) {
|
|
20
|
+
// TODO: return if localstorage-query, etc...
|
|
21
|
+
// - Decide how best to handle, considering localstorage is also handled by event.
|
|
22
|
+
if (
|
|
23
|
+
element.hasAttribute("localstorage-attribute") ||
|
|
24
|
+
element.hasAttribute("localstorage-value") ||
|
|
25
|
+
element.hasAttribute("localstorage-key")
|
|
26
|
+
)
|
|
27
|
+
return;
|
|
28
|
+
let value = self.getItem(e.key);
|
|
29
|
+
if (value != null) {
|
|
30
|
+
element.setValue(value);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
},
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Initializes a collection of elements.
|
|
38
|
+
* @param {Array<Element>} elements - An array of elements to be initialized.
|
|
39
|
+
*/
|
|
40
|
+
initElements: function (elements) {
|
|
41
|
+
for (let element of elements) this.initElement(element);
|
|
42
|
+
},
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Initializes a single element.
|
|
46
|
+
* @param {Element} element - The element to initialize. This function expects an 'Element' type.
|
|
47
|
+
*/
|
|
48
|
+
initElement: function (element) {
|
|
49
|
+
let value = this.getItem(element);
|
|
50
|
+
if (value) element.setValue(value);
|
|
51
|
+
else {
|
|
52
|
+
let inputEvent = new CustomEvent("input", {
|
|
53
|
+
bubbles: true
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
Object.defineProperty(inputEvent, "target", {
|
|
57
|
+
writable: false,
|
|
58
|
+
value: element
|
|
59
|
+
});
|
|
60
|
+
element.dispatchEvent(inputEvent);
|
|
61
|
+
}
|
|
62
|
+
element.addEventListener("input", (e) => {
|
|
63
|
+
let isRealtime = element.getAttribute("realtime");
|
|
64
|
+
// Returns if realtime false.
|
|
65
|
+
if (!isRealtime && isRealtime === "false") return;
|
|
66
|
+
|
|
67
|
+
let key = e.target.getAttribute("localstorage-set");
|
|
68
|
+
// Set the key and value in the localstorage.
|
|
69
|
+
if (key) this.setItem(key, e.target.value);
|
|
70
|
+
|
|
71
|
+
let elements = document.querySelectorAll(
|
|
72
|
+
`[localstorage-get="${key}"]`
|
|
73
|
+
);
|
|
74
|
+
for (let el of elements) {
|
|
75
|
+
if (el != element) {
|
|
76
|
+
let value = this.getItem(key);
|
|
77
|
+
// Set the value of the element.
|
|
78
|
+
if (value != null) {
|
|
79
|
+
el.setValue(value);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
},
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* @param key
|
|
88
|
+
*
|
|
89
|
+
* @return { Mixed } The value associated with the key or undefined if not found. Note that this will be returned as a string if the key is an array
|
|
90
|
+
*/
|
|
91
|
+
getItem: function (key) {
|
|
92
|
+
// Returns the value of the key in the storage.
|
|
93
|
+
if (this.support) return window.localStorage.getItem(key);
|
|
94
|
+
else return this.storage.get(key);
|
|
95
|
+
},
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* @param key - key name to store the value under
|
|
99
|
+
* @param value - value to store
|
|
100
|
+
*/
|
|
101
|
+
setItem: function (key, value) {
|
|
102
|
+
try {
|
|
103
|
+
if (this.support) {
|
|
104
|
+
const oldValue = localStorage.getItem(key);
|
|
105
|
+
|
|
106
|
+
window.localStorage.setItem(key, value);
|
|
107
|
+
|
|
108
|
+
const keys = [
|
|
109
|
+
"organization_id",
|
|
110
|
+
"user_id",
|
|
111
|
+
"clientId",
|
|
112
|
+
"session_id"
|
|
113
|
+
];
|
|
114
|
+
if (keys.includes(key)) {
|
|
115
|
+
const updateEvent = new CustomEvent("updateAttributes", {
|
|
116
|
+
detail: { key, newValue: value, oldValue }
|
|
117
|
+
});
|
|
118
|
+
window.dispatchEvent(updateEvent);
|
|
119
|
+
}
|
|
120
|
+
} else this.storage.set(key, value);
|
|
121
|
+
} catch (error) {
|
|
122
|
+
if (
|
|
123
|
+
error instanceof DOMException &&
|
|
124
|
+
(error.code === 22 ||
|
|
125
|
+
error.code === 1014 ||
|
|
126
|
+
error.name === "QuotaExceededError" ||
|
|
127
|
+
error.name === "NS_ERROR_DOM_QUOTA_REACHED")
|
|
128
|
+
) {
|
|
129
|
+
// TODO: create a fallback method, perhaps setting in indexeddb if above a specific size
|
|
130
|
+
console.log(
|
|
131
|
+
"Local storage limit exceeded. Falling back to IndexedDB."
|
|
132
|
+
);
|
|
133
|
+
} else {
|
|
134
|
+
console.error("Error setting item:", error);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
},
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* @param key - The key name to delete from the storage
|
|
141
|
+
*/
|
|
142
|
+
removeItem: function (key) {
|
|
143
|
+
// Removes an item from the storage.
|
|
144
|
+
if (this.support) window.localStorage.removeItem(key);
|
|
145
|
+
else this.storage.delete(key);
|
|
146
|
+
},
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* @param action
|
|
150
|
+
*
|
|
151
|
+
* @return { undefined } No return
|
|
152
|
+
*/
|
|
153
|
+
runStorage: async function (action) {
|
|
154
|
+
const form = action.form;
|
|
155
|
+
// If the form is not a form return false.
|
|
156
|
+
if (!form) return;
|
|
157
|
+
|
|
158
|
+
let set_els = form.querySelectorAll("[localstorage-set]");
|
|
159
|
+
for (let el of set_els) {
|
|
160
|
+
let key = el.getAttribute("localstorage-set");
|
|
161
|
+
let value = await el.getValue();
|
|
162
|
+
// Sets the value of an item.
|
|
163
|
+
if (value && key) {
|
|
164
|
+
this.setItem(key, value);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
let get_els = form.querySelectorAll("[localstorage-get]");
|
|
168
|
+
for (let el of get_els) {
|
|
169
|
+
let key = el.getAttribute("localstorage-get");
|
|
170
|
+
// If key is not set return false.
|
|
171
|
+
if (!key) return;
|
|
172
|
+
let value = this.getItem(key);
|
|
173
|
+
// Set the value of the element.
|
|
174
|
+
if (value != null) {
|
|
175
|
+
el.setValue(value);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
let remove_els = form.querySelectorAll("[localstorage-remove]");
|
|
179
|
+
for (let el of remove_els) {
|
|
180
|
+
el.setValue("");
|
|
181
|
+
let key = el.getAttribute("localstorage-remove");
|
|
182
|
+
// Removes an item from the list.
|
|
183
|
+
if (key) {
|
|
184
|
+
this.removeItem(key);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
action.element.dispatchEvent(
|
|
189
|
+
new CustomEvent("localStorage", {
|
|
190
|
+
detail: {}
|
|
191
|
+
})
|
|
192
|
+
);
|
|
193
|
+
},
|
|
194
|
+
|
|
195
|
+
checkSupport: function () {
|
|
196
|
+
// Check if the browser supports localStorage.
|
|
197
|
+
if (!("localStorage" in window)) {
|
|
198
|
+
console.log("This browser doesn't support localStorage.");
|
|
199
|
+
this.support = false;
|
|
200
|
+
} else {
|
|
201
|
+
try {
|
|
202
|
+
let test = window.localStorage.getItem("test");
|
|
203
|
+
// If the CoCreateConfig. localStorage is false this method will set support to false.
|
|
204
|
+
if (window.CoCreateConfig)
|
|
205
|
+
if (window.CoCreateConfig.localStorage === false)
|
|
206
|
+
// If the server supports local storage
|
|
207
|
+
this.support = false;
|
|
208
|
+
} catch (e) {
|
|
209
|
+
this.support = false;
|
|
210
|
+
} finally {
|
|
211
|
+
// Initialize the component. If support is enabled the method init is called.
|
|
212
|
+
if (this.support) this.init();
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
};
|
|
217
|
+
|
|
218
|
+
Actions.init(
|
|
219
|
+
{
|
|
220
|
+
name: "localStorage",
|
|
221
|
+
endEvent: "localStorage",
|
|
222
|
+
callback: (data) => {
|
|
223
|
+
CoCreateLocalStorage.runStorage(data);
|
|
224
|
+
}
|
|
225
|
+
},
|
|
226
|
+
{
|
|
227
|
+
name: "localStorageRemove",
|
|
228
|
+
endEvent: "localStorageRemoved",
|
|
229
|
+
callback: (data) => {
|
|
230
|
+
CoCreateLocalStorage.runStorage(data);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
);
|
|
234
|
+
|
|
235
|
+
Observer.init({
|
|
236
|
+
types: ["addedNodes"],
|
|
237
|
+
selector: "[localstorage-set]",
|
|
238
|
+
callback: async function (mutation) {
|
|
239
|
+
let key = mutation.target.getAttribute("localstorage-set");
|
|
240
|
+
let value = await mutation.target.getValue();
|
|
241
|
+
if (key && value) localStorage.setItem(key, value);
|
|
242
|
+
}
|
|
230
243
|
});
|
|
231
244
|
|
|
232
|
-
CoCreateLocalStorage.checkSupport()
|
|
245
|
+
CoCreateLocalStorage.checkSupport();
|
|
233
246
|
|
|
234
|
-
export default CoCreateLocalStorage;
|
|
247
|
+
export default CoCreateLocalStorage;
|