-
Notifications
You must be signed in to change notification settings - Fork 42
/
Copy pathstore.js
133 lines (111 loc) · 3.38 KB
/
store.js
1
2
3
4
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
/**
* Patterns store - store pattern state locally in the browser
*
* Copyright 2008-2012 Simplon B.V.
* Copyright 2011 Humberto Sermeño
* Copyright 2011 Florian Friesdorf
*/
import logging from "./logging";
const log = logging.getLogger("Patternslib Store");
function Storage(backend, prefix) {
this.prefix = prefix;
this.backend = backend;
}
Storage.prototype._key = function Storage_key(name) {
return this.prefix + ":" + name;
};
Storage.prototype._allKeys = function Storage_allKeys() {
var keys = [],
prefix = this.prefix + ":",
prefix_length = prefix.length,
key,
i;
for (i = 0; i < this.backend.length; i++) {
key = this.backend.key(i);
if (key.slice(0, prefix_length) === prefix) keys.push(key);
}
return keys;
};
Storage.prototype.get = function Storage_get(name) {
var key = this._key(name),
value = this.backend.getItem(key);
if (value !== null) {
try {
value = JSON.parse(value);
} catch {
log.warn(`Cannot parse storage value for key ${key}`);
return;
}
}
return value;
};
Storage.prototype.set = function Storage_set(name, value) {
var key = this._key(name);
return this.backend.setItem(key, JSON.stringify(value));
};
Storage.prototype.remove = function Storage_remove(name) {
var key = this._key(name);
return this.backend.removeItem(key);
};
Storage.prototype.clear = function Storage_clear() {
var keys = this._allKeys();
for (var i = 0; i < keys.length; i++) this.backend.removeItem(keys[i]);
};
Storage.prototype.all = function Storage_all() {
var keys = this._allKeys(),
prefix_length = this.prefix.length + 1,
lk,
data = {};
for (var i = 0; i < keys.length; i++) {
lk = keys[i].slice(prefix_length);
data[lk] = JSON.parse(this.backend.getItem(keys[i]));
}
return data;
};
function ValueStorage(store, name) {
this.store = store;
this.name = name;
}
ValueStorage.prototype.get = function ValueStorage_get() {
return this.store.get(this.name);
};
ValueStorage.prototype.set = function ValueStorage_get(value) {
return this.store.set(this.name, value);
};
ValueStorage.prototype.remove = function ValueStorage_remove() {
return this.store.remove(this.name);
};
var store = {
supported: false,
local: function (name) {
return new Storage(window.localStorage, name);
},
session: function (name) {
return new Storage(window.sessionStorage, name);
},
ValueStorage: ValueStorage,
// Update storage options for a given element.
updateOptions: function store_updateOptions(trigger, options) {
if (options.store !== "none") {
if (!trigger.id) {
log.warn("state persistance requested, but element has no id");
options.store = "none";
} else if (!store.supported) {
log.warn(
"state persistance requested, but browser does not support webstorage"
);
options.store = "none";
}
}
return options;
},
};
// Perform the test separately since this may throw a SecurityError as
// reported in #326
try {
store.supported = typeof window.sessionStorage !== "undefined";
} catch (e) {
// just ignore.
}
export default store;
export { store as Store };