@cocreate/element-prototype 1.26.0 → 1.28.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/src/getValue.js CHANGED
@@ -1,396 +1,414 @@
1
- const storage = new Map()
1
+ import utility from "./utility";
2
2
 
3
- HTMLElement.prototype.getValue = function () {
4
- let value = getValue(this)
5
- return value;
6
- };
7
-
8
- HTMLInputElement.prototype.getValue = function () {
9
- let value = getValue(this)
10
- return value;
11
- };
3
+ const storage = new Map();
12
4
 
13
- HTMLHeadingElement.prototype.getValue = function () {
14
- let value = getValue(this)
15
- return value;
5
+ HTMLElement.prototype.getValue = function () {
6
+ let value = getValue(this);
7
+ return value;
16
8
  };
17
9
 
18
10
  // TODO: check if using a a switch case will provide better performance
11
+ // return blobs for element.src and for link.href
12
+ // pass value type as a param
19
13
  const getValue = (element) => {
20
- let value = element.value || element.getAttribute('value') || "";
21
- if (element.hasAttribute('component') || element.hasAttribute('plugin') || element.type === 'file' || element.getAttribute('type') === 'file') {
22
- value = storage.get(element)
23
- storage.delete(element)
24
- return value
25
- }
26
-
27
- let prefix = element.getAttribute('value-prefix') || "";
28
- let suffix = element.getAttribute('value-suffix') || "";
29
- let valueType = element.getAttribute('value-type') || "";
30
-
31
- if (element.type === "checkbox") {
32
- let inputs = [element]
33
- let key = element.getAttribute('key');
34
- if (key)
35
- inputs = document.querySelectorAll(`input[type="${element.type}"][key="${key}"]`);
36
-
37
-
38
- if (inputs.length > 1) {
39
- value = [];
40
- inputs.forEach(el => {
41
- if (el.checked) {
42
- let checkedValue = el.value
43
- if (prefix || suffix)
44
- checkedValue = prefix + checkedValue + suffix;
45
-
46
- value.push(checkedValue);
47
- }
48
- });
49
- } else {
50
- if (element.checked) {
51
- if (element.hasAttribute('value'))
52
- value = element.value || true
53
- else
54
- value = true
55
- } else
56
- value = false
57
-
58
- }
59
- } else if (element.type === 'radio') {
60
- let key = element.getAttribute('key');
61
- value = document.querySelector(`input[key="${key}"]:checked`).value
62
- } else if (element.type === "number") {
63
- value = Number(value);
64
- } else if (element.type === 'range') {
65
- value = [Number(element.min), Number(element.value)];
66
- } else if (element.type === "password") {
67
- value = btoa(value || '');
68
- } else if (element.type === "email") {
69
- value = value.toLowerCase();
70
- } else if (element.type === "url") {
71
- // TODO: define attributes to return url parts
72
- // return as a string or an object of url parts
73
- } else if (element.tagName == "SELECT" && element.hasAttribute('multiple')) {
74
- let options = element.selectedOptions;
75
- value = [];
76
- for (let i = 0; i < options.length; i++) {
77
- let optionValue = options[i].value
78
- if (prefix || suffix)
79
- optionValue = prefix + optionValue + suffix;
80
- value.push(optionValue);
81
- }
82
- } else if (["time", "date", "datetime", "datetime-local"].includes(element.getAttribute('type'))) {
83
- if (value === '$now')
84
- value = new Date()
85
- else if (value)
86
- value = new Date(value)
87
-
88
- if (value) {
89
- if (!valueType)
90
- value = value.toISOString()
91
-
92
- if (element.type === 'time')
93
- // value = value.substring(11, 8) + 'Z';
94
- value = value.substring(11, 19) + 'Z';
95
-
96
- switch (valueType) {
97
- case 'getDayName':
98
- const days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
99
- value = days[value.getDay()];
100
- break;
101
- case 'getMonthName':
102
- const months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
103
- value = months[value.getMonth()];
104
- break;
105
- case 'toUnixTimestamp':
106
- value = Math.floor(value.getTime() / 1000);
107
- break;
108
- case 'toLocaleString':
109
- let locale = element.getAttribute('locale') || 'en-US'
110
- value = value[valueType](locale);
111
- break;
112
- default:
113
- if (typeof value[valueType] === 'function') {
114
- value = value[valueType]();
115
- } else {
116
- console.warn(`The method ${valueType} is not a function of Date object.`);
117
- }
118
- }
119
- }
120
- } else if (element.tagName == 'INPUT' || element.tagName == 'SELECT') {
121
- value = element.value;
122
- } else if (element.tagName == 'TEXTAREA') {
123
- if (element.hasAttribute('value'))
124
- value = element.getAttribute('value');
125
- else
126
- value = element.value;
127
- } else if (element.tagName === 'IFRAME') {
128
- value = element.srcdoc;
129
- } else if (element.hasAttribute('value')) {
130
- value = element.getAttribute('value');
131
- } else if (valueType === 'text') {
132
- value = element.innerText;
133
- } else {
134
- value = element.innerHTML;
135
- }
136
-
137
- if (valueType === 'boolean') {
138
- if (!value || value === 'fasle')
139
- return false
140
- else
141
- return true
142
- }
143
-
144
- if (value === '$organization_id')
145
- value = localStorage.getItem('organization_id')
146
- else if (value === '$user_id')
147
- value = localStorage.getItem('user_id')
148
- else if (value === '$clientId')
149
- value = localStorage.getItem('clientId')
150
- else if (value === '$session_id')
151
- value = localStorage.getItem('session_id')
152
- else if (typeof value === 'string') {
153
- if (value.startsWith('$search')) {
154
- const searchParams = new URLSearchParams(window.location.search);
155
- if (value.includes('.')) {
156
- value = searchParams.get(value.split('.')[1]);
157
- } else {
158
- const paramsObject = {};
159
-
160
- // Iterate over all key-value pairs and add them to the object
161
- for (const [key, value] of searchParams) {
162
- paramsObject[key] = value;
163
- }
164
- value = paramsObject
165
- }
166
-
167
- } else if ([
168
- '$href',
169
- '$origin',
170
- '$protocol',
171
- '$host',
172
- '$hostname',
173
- '$port',
174
- '$pathname',
175
- '$hash'
176
- ].includes(value)) {
177
- value = window.location[value.substring(1)]
178
- }
179
- }
180
-
181
- try {
182
- let replace = element.getAttribute('value-replace');
183
- let replaceAll = element.getAttribute('value-replaceall');
184
- let test = element.getAttribute('value-test');
185
- let match = element.getAttribute('value-match');
186
- let split = element.getAttribute('value-split');
187
- let lastIndex = element.getAttribute('value-lastindex');
188
- let search = element.getAttribute('value-search');
189
- let exec = element.getAttribute('value-exec');
190
-
191
- if (replace || replaceAll || test || match || split || lastIndex || search || exec) {
192
- let { regex, replacement } = regexParser(replace || replaceAll || test || match || split || lastIndex || search || exec);
193
-
194
- if (regex) {
195
- if (replace)
196
- replace = regex;
197
- else if (replaceAll)
198
- replaceAll = regex;
199
- else if (test)
200
- test = regex;
201
- else if (match)
202
- match = regex;
203
- else if (split)
204
- split = regex;
205
- else if (lastIndex)
206
- lastIndex = regex;
207
- else if (search)
208
- search = regex;
209
- else if (exec)
210
- exec = regex;
211
- }
212
-
213
- replacement = replacement || element.getAttribute('value-replacement') || "";
214
-
215
- if (replacement !== undefined) {
216
- if (replace) {
217
- value = value.replace(replace, replacement);
218
- } else if (replaceAll) {
219
- value = value.replaceAll(replaceAll, replacement);
220
- }
221
- }
222
-
223
- if (test) {
224
- value = regex.test(value);
225
- }
226
-
227
- if (match) {
228
- const matches = value.match(match);
229
- if (matches) {
230
- value = matches[1] || matches[0]; // prioritize capturing group match if available
231
- }
232
- }
233
-
234
- if (split) {
235
- value = value.split(split);
236
- }
237
-
238
- if (lastIndex) {
239
- regex.lastIndex = 0; // Ensure starting index is 0
240
- regex.test(value);
241
- value = regex.lastIndex;
242
- }
243
-
244
- if (search) {
245
- value = value.search(search);
246
- }
247
-
248
- if (exec) {
249
- const execResult = regex.exec(value);
250
- if (execResult) {
251
- value = execResult[1] || execResult[0]; // prioritize capturing group match if available
252
- } else {
253
- value = null;
254
- }
255
- }
256
- }
257
- } catch (error) {
258
- console.error('getValue() error:', error, element);
259
- }
260
-
261
- // TODO: encode and decode needs a method to prevent multiple encode of an already encoded value
262
- let encode = element.getAttribute('value-encode')
263
- if (encode)
264
- value = encodeValue(value, encode)
265
-
266
- let decode = element.getAttribute('value-decode')
267
- if (decode)
268
- value = decodeValue(value, decode)
269
-
270
- let lowercase = element.getAttribute('value-lowercase')
271
- if (lowercase || lowercase === '')
272
- value = value.toLowerCase()
273
- let uppercase = element.getAttribute('value-uppercase');
274
- if (uppercase || uppercase === '')
275
- value = value.toUpperCase()
276
-
277
- // Apply prefix and suffix first, before JSON parsing
278
- if (typeof value === 'string' || typeof value === 'number') {
279
- if (prefix || suffix) {
280
- value = prefix + value + suffix;
281
- }
282
- }
283
-
284
- // Handle JSON parsing for objects, arrays, or when valueType starts with 'array'
285
- if (value && (valueType === 'object' || valueType === 'json' || valueType.startsWith('array'))) {
286
- try {
287
- value = JSON.parse(value);
288
- } catch (error) {
289
- const jsonRegex = /(\{[\s\S]*\}|\[[\s\S]*\])/;
290
- const match = value.match(jsonRegex);
291
-
292
- if (match) {
293
- try {
294
- value = JSON.parse(match[0]);
295
- } catch (e) {
296
- console.error('Failed to parse JSON after regex extraction:', e);
297
- }
298
- } else {
299
- console.error('No valid JSON structure found in the string.');
300
- }
301
- }
302
- }
303
-
304
- // Now handle array-specific logic if valueType starts with 'array'
305
- if (valueType.startsWith('array')) {
306
- if (!Array.isArray(value)) {
307
- // If the parsed value is an object, apply array conversion based on operators
308
- if (typeof value === 'object') {
309
- if (valueType === 'array.$keys') {
310
- value = Object.keys(value);
311
- } else if (valueType === 'array.$values') {
312
- value = Object.values(value);
313
- } else if (valueType === 'array.$entries') {
314
- value = Object.entries(value);
315
- } else {
316
- // Default behavior: wrap the object in an array
317
- value = [value];
318
- }
319
- } else {
320
- // If it's not an object (i.e., a primitive), wrap the value in an array
321
- value = [value];
322
- }
323
- }
324
- }
325
-
326
- return value;
327
-
14
+ let value = element.value || element.getAttribute("value") || "";
15
+ if (
16
+ element.hasAttribute("component") ||
17
+ element.hasAttribute("plugin") ||
18
+ element.type === "file" ||
19
+ element.getAttribute("type") === "file"
20
+ ) {
21
+ value = storage.get(element);
22
+ storage.delete(element);
23
+ return value;
24
+ }
25
+
26
+ let prefix = element.getAttribute("value-prefix") || "";
27
+ let suffix = element.getAttribute("value-suffix") || "";
28
+ let valueType = element.getAttribute("value-type") || "";
29
+
30
+ if (element.type === "checkbox") {
31
+ let inputs = [element];
32
+ let key = element.getAttribute("key");
33
+ if (key)
34
+ inputs = document.querySelectorAll(
35
+ `input[type="${element.type}"][key="${key}"]`
36
+ );
37
+
38
+ if (inputs.length > 1) {
39
+ value = [];
40
+ inputs.forEach((el) => {
41
+ if (el.checked) {
42
+ let checkedValue = el.value;
43
+ if (prefix || suffix)
44
+ checkedValue = prefix + checkedValue + suffix;
45
+
46
+ value.push(checkedValue);
47
+ }
48
+ });
49
+ } else {
50
+ if (element.checked) {
51
+ if (element.hasAttribute("value"))
52
+ value = element.value || true;
53
+ else value = true;
54
+ } else value = false;
55
+ }
56
+ } else if (element.type === "radio") {
57
+ let key = element.getAttribute("key");
58
+ value = document.querySelector(`input[key="${key}"]:checked`).value;
59
+ } else if (element.type === "number") {
60
+ value = Number(value);
61
+ } else if (element.type === "range") {
62
+ value = [Number(element.min), Number(element.value)];
63
+ } else if (element.type === "password") {
64
+ value = btoa(value || "");
65
+ } else if (element.type === "email") {
66
+ value = value.toLowerCase();
67
+ } else if (element.type === "url") {
68
+ // TODO: define attributes to return url parts
69
+ // return as a string or an object of url parts
70
+ } else if (
71
+ element.tagName == "SELECT" &&
72
+ element.hasAttribute("multiple")
73
+ ) {
74
+ let options = element.selectedOptions;
75
+ value = [];
76
+ for (let i = 0; i < options.length; i++) {
77
+ let optionValue = options[i].value;
78
+ if (prefix || suffix) optionValue = prefix + optionValue + suffix;
79
+ value.push(optionValue);
80
+ }
81
+ } else if (
82
+ ["time", "date", "datetime", "datetime-local"].includes(
83
+ element.getAttribute("type")
84
+ )
85
+ ) {
86
+ if (value === "$now") value = new Date();
87
+ else if (value) value = new Date(value);
88
+
89
+ if (value) {
90
+ if (!valueType) value = value.toISOString();
91
+
92
+ if (element.type === "time")
93
+ // value = value.substring(11, 8) + 'Z';
94
+ value = value.substring(11, 19) + "Z";
95
+
96
+ switch (valueType) {
97
+ case "getDayName":
98
+ const days = [
99
+ "Sunday",
100
+ "Monday",
101
+ "Tuesday",
102
+ "Wednesday",
103
+ "Thursday",
104
+ "Friday",
105
+ "Saturday"
106
+ ];
107
+ value = days[value.getDay()];
108
+ break;
109
+ case "getMonthName":
110
+ const months = [
111
+ "January",
112
+ "February",
113
+ "March",
114
+ "April",
115
+ "May",
116
+ "June",
117
+ "July",
118
+ "August",
119
+ "September",
120
+ "October",
121
+ "November",
122
+ "December"
123
+ ];
124
+ value = months[value.getMonth()];
125
+ break;
126
+ case "toUnixTimestamp":
127
+ value = Math.floor(value.getTime() / 1000);
128
+ break;
129
+ case "toLocaleString":
130
+ let locale = element.getAttribute("locale") || "en-US";
131
+ value = value[valueType](locale);
132
+ break;
133
+ default:
134
+ if (typeof value[valueType] === "function") {
135
+ value = value[valueType]();
136
+ } else {
137
+ console.warn(
138
+ `The method ${valueType} is not a function of Date object.`
139
+ );
140
+ }
141
+ }
142
+ }
143
+ } else if (element.tagName == "INPUT" || element.tagName == "SELECT") {
144
+ value = element.value;
145
+ } else if (element.tagName == "TEXTAREA") {
146
+ if (element.hasAttribute("value"))
147
+ value = element.getAttribute("value");
148
+ else value = element.value;
149
+ } else if (element.tagName === "IFRAME") {
150
+ value = element.srcdoc;
151
+ } else if (element.hasAttribute("value")) {
152
+ value = element.getAttribute("value");
153
+ } else {
154
+ let targetElement = element;
155
+
156
+ // If value-exclude-selector exists, clone the element and remove the specified selectors
157
+ const excludeSelector = element.getAttribute("value-remove-selector");
158
+ if (excludeSelector) {
159
+ targetElement = element.cloneNode(true);
160
+
161
+ // Remove matching elements from the cloned element
162
+ targetElement
163
+ .querySelectorAll(excludeSelector)
164
+ .forEach((el) => el.remove());
165
+ }
166
+
167
+ // Determine whether to use outerHTML, innerHTML, or innerText based on valueType
168
+ if (valueType === "text") {
169
+ value = targetElement.innerText;
170
+ } else if (valueType === "outerHTML") {
171
+ value = targetElement.outerHTML;
172
+ } else {
173
+ value = targetElement.innerHTML;
174
+ }
175
+ }
176
+
177
+ if (valueType === "boolean") {
178
+ if (!value || value === "fasle") return false;
179
+ else return true;
180
+ }
181
+
182
+ if (value === "$organization_id")
183
+ value = localStorage.getItem("organization_id");
184
+ else if (value === "$user_id") value = localStorage.getItem("user_id");
185
+ else if (value === "$clientId") value = localStorage.getItem("clientId");
186
+ else if (value === "$session_id")
187
+ value = localStorage.getItem("session_id");
188
+ else if (typeof value === "string" && value.includes("$")) {
189
+ value = utility.urlOperators(value);
190
+ }
191
+
192
+ try {
193
+ const attributes = element.attributes; // Get all attributes of the element
194
+ const regexAttribute = [
195
+ "value-replace",
196
+ "value-replaceall",
197
+ "value-test",
198
+ "value-match",
199
+ "value-split",
200
+ "value-lastindex",
201
+ "value-search",
202
+ "value-exec"
203
+ ];
204
+ // Process each attribute in order
205
+ for (let i = 0; i < attributes.length; i++) {
206
+ if (value === null || value === undefined) break;
207
+
208
+ if (!regexAttribute.includes(attributes[i].name)) continue;
209
+
210
+ let regexAttributeValue = attributes[i].value;
211
+
212
+ if (!regexAttributeValue) continue;
213
+
214
+ let { regex, replacement } = regexParser(regexAttributeValue);
215
+
216
+ if (regex) regexAttributeValue = regex;
217
+
218
+ replacement =
219
+ replacement || element.getAttribute("value-replacement") || "";
220
+
221
+ switch (attributes[i].name) {
222
+ case "value-replace":
223
+ value = value.replace(regexAttributeValue, replacement);
224
+ break;
225
+
226
+ case "value-replaceall":
227
+ value = value.replaceAll(regexAttributeValue, replacement);
228
+ break;
229
+
230
+ case "value-test":
231
+ value = regex.test(value);
232
+ break;
233
+
234
+ case "value-match":
235
+ const matches = value.match(regexAttributeValue);
236
+ if (matches) {
237
+ value = matches[1] || matches[0]; // Prioritize capturing group if available
238
+ }
239
+ break;
240
+
241
+ case "value-split":
242
+ value = value.split(regexAttributeValue);
243
+ break;
244
+
245
+ case "value-lastindex":
246
+ regex.lastIndex = 0; // Ensure starting index is 0
247
+ regex.test(value);
248
+ value = regex.lastIndex;
249
+ break;
250
+
251
+ case "value-search":
252
+ value = value.search(regexAttributeValue);
253
+ break;
254
+
255
+ case "value-exec":
256
+ const execResult = regex.exec(value);
257
+ if (execResult) {
258
+ value = execResult[1] || execResult[2] || execResult[0]; // Prioritize capturing group if available
259
+ } else {
260
+ // value = null;
261
+ }
262
+ break;
263
+
264
+ default:
265
+ // Ignore other attributes
266
+ break;
267
+ }
268
+ }
269
+ } catch (error) {
270
+ console.error("getValue() error:", error, element);
271
+ }
272
+
273
+ // TODO: encode and decode needs a method to prevent multiple encode of an already encoded value
274
+ let encode = element.getAttribute("value-encode");
275
+ if (encode) value = encodeValue(value, encode);
276
+
277
+ let decode = element.getAttribute("value-decode");
278
+ if (decode) value = decodeValue(value, decode);
279
+
280
+ let lowercase = element.getAttribute("value-lowercase");
281
+ if (lowercase || lowercase === "") value = value.toLowerCase();
282
+ let uppercase = element.getAttribute("value-uppercase");
283
+ if (uppercase || uppercase === "") value = value.toUpperCase();
284
+
285
+ // Apply prefix and suffix first, before JSON parsing
286
+ if (typeof value === "string" || typeof value === "number") {
287
+ if (prefix || suffix) {
288
+ value = prefix + value + suffix;
289
+ }
290
+ }
291
+
292
+ // Handle JSON parsing for objects, arrays, or when valueType starts with 'array'
293
+ if (
294
+ value &&
295
+ (valueType === "object" ||
296
+ valueType === "json" ||
297
+ valueType.startsWith("array"))
298
+ ) {
299
+ try {
300
+ value = JSON.parse(value);
301
+ } catch (error) {
302
+ const jsonRegex = /(\{[\s\S]*\}|\[[\s\S]*\])/;
303
+ const match = value.match(jsonRegex);
304
+
305
+ if (match) {
306
+ try {
307
+ value = JSON.parse(match[0]);
308
+ } catch (e) {
309
+ console.error(
310
+ "Failed to parse JSON after regex extraction:",
311
+ e
312
+ );
313
+ }
314
+ } else {
315
+ console.error("No valid JSON structure found in the string.");
316
+ }
317
+ }
318
+ }
319
+
320
+ // Now handle array-specific logic if valueType starts with 'array'
321
+ if (valueType.startsWith("array")) {
322
+ if (!Array.isArray(value)) {
323
+ // If the parsed value is an object, apply array conversion based on operators
324
+ if (typeof value === "object") {
325
+ if (valueType === "array.$keys") {
326
+ value = Object.keys(value);
327
+ } else if (valueType === "array.$values") {
328
+ value = Object.values(value);
329
+ } else if (valueType === "array.$entries") {
330
+ value = Object.entries(value);
331
+ } else {
332
+ // Default behavior: wrap the object in an array
333
+ value = [value];
334
+ }
335
+ } else {
336
+ // If it's not an object (i.e., a primitive), wrap the value in an array
337
+ value = [value];
338
+ }
339
+ }
340
+ }
341
+
342
+ return value;
328
343
  };
329
344
 
330
345
  function regexParser(string) {
331
- let regex, replacement;
332
- let regexMatch = string.match(/\/(.+)\/([gimuy]*)/);
333
- if (regexMatch) {
334
- regex = new RegExp(regexMatch[1], regexMatch[2]);
335
- const splitReplace = string.split(', ');
336
- replacement = splitReplace.length > 1 ? splitReplace[1].slice(1, -1) : "";
337
- }
338
-
339
- return { regex, replacement }
346
+ let regex, replacement;
347
+ let regexMatch = string.match(/\/(.+)\/([gimuy]*)/);
348
+ if (regexMatch) {
349
+ regex = new RegExp(regexMatch[1], regexMatch[2]);
350
+ const splitReplace = string.split(", ");
351
+ replacement =
352
+ splitReplace.length > 1 ? splitReplace[1].slice(1, -1) : "";
353
+ }
354
+
355
+ return { regex, replacement };
340
356
  }
341
357
 
342
358
  function encodeValue(value, encodingType) {
343
- switch (encodingType.toLowerCase()) {
344
- case 'url':
345
- case 'uri':
346
- return encodeURI(value.replace(/ /g, "%20"));
347
- case 'uri-component':
348
- return encodeURIComponent(value.replace(/ /g, "%20"));
349
- case 'base64':
350
- case 'atob':
351
- const encoder = new TextEncoder();
352
- const uint8Array = encoder.encode(value);
353
- return btoa(String.fromCharCode(...uint8Array));
354
- case 'html-entities':
355
- return value.replace(/[\u00A0-\u9999<>\&]/g, (i) => {
356
- return `&#${i.charCodeAt(0)};`;
357
- });
358
- case 'json':
359
- return JSON.stringify(value);
360
- default:
361
- throw new Error(`Unsupported encoding type: ${encodingType}`);
362
- }
359
+ switch (encodingType.toLowerCase()) {
360
+ case "url":
361
+ case "uri":
362
+ return encodeURI(value.replace(/ /g, "%20"));
363
+ case "uri-component":
364
+ return encodeURIComponent(value.replace(/ /g, "%20"));
365
+ case "base64":
366
+ case "atob":
367
+ const encoder = new TextEncoder();
368
+ const uint8Array = encoder.encode(value);
369
+ return btoa(String.fromCharCode(...uint8Array));
370
+ case "html-entities":
371
+ return value.replace(/[\u00A0-\u9999<>\&]/g, (i) => {
372
+ return `&#${i.charCodeAt(0)};`;
373
+ });
374
+ case "json":
375
+ return JSON.stringify(value);
376
+ default:
377
+ throw new Error(`Unsupported encoding type: ${encodingType}`);
378
+ }
363
379
  }
364
380
 
365
381
  function decodeValue(value, decodingType) {
366
- switch (decodingType.toLowerCase()) {
367
- case 'url':
368
- case 'uri':
369
- return decodeURI(value);
370
- case 'uri-component':
371
- return decodeURIComponent(value);
372
- case 'base64':
373
- case 'btoa': // New case for Base64 decoding (alias for 'base64')
374
- try {
375
- const decodedArray = Uint8Array.from(atob(value), (c) => c.charCodeAt(0));
376
- const decoder = new TextDecoder();
377
- return decoder.decode(decodedArray);
378
- } catch (error) {
379
- throw new Error(`Invalid Base64 string: ${error.message}`);
380
- }
381
- case 'html-entities':
382
- const tempElement = document.createElement('div');
383
- tempElement.innerHTML = value;
384
- return tempElement.textContent;
385
- case 'json':
386
- try {
387
- return JSON.parse(value);
388
- } catch (error) {
389
- throw new Error(`Invalid JSON string: ${error.message}`);
390
- }
391
- default:
392
- throw new Error(`Unsupported decoding type: ${decodingType}`);
393
- }
382
+ switch (decodingType.toLowerCase()) {
383
+ case "url":
384
+ case "uri":
385
+ return decodeURI(value);
386
+ case "uri-component":
387
+ return decodeURIComponent(value);
388
+ case "base64":
389
+ case "btoa": // New case for Base64 decoding (alias for 'base64')
390
+ try {
391
+ const decodedArray = Uint8Array.from(atob(value), (c) =>
392
+ c.charCodeAt(0)
393
+ );
394
+ const decoder = new TextDecoder();
395
+ return decoder.decode(decodedArray);
396
+ } catch (error) {
397
+ throw new Error(`Invalid Base64 string: ${error.message}`);
398
+ }
399
+ case "html-entities":
400
+ const tempElement = document.createElement("div");
401
+ tempElement.innerHTML = value;
402
+ return tempElement.textContent;
403
+ case "json":
404
+ try {
405
+ return JSON.parse(value);
406
+ } catch (error) {
407
+ throw new Error(`Invalid JSON string: ${error.message}`);
408
+ }
409
+ default:
410
+ throw new Error(`Unsupported decoding type: ${decodingType}`);
411
+ }
394
412
  }
395
413
 
396
414
  export { getValue, storage };