@vxrn/color-scheme 1.27.1 → 2.0.0-beta.45.1
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/cjs/index.cjs +63 -87
- package/dist/cjs/index.native.cjs +75 -0
- package/dist/cjs/index.native.js +47 -66
- package/dist/cjs/index.native.js.map +1 -1
- package/dist/cjs/safeStorage.cjs +23 -25
- package/dist/cjs/safeStorage.native.cjs +40 -0
- package/dist/cjs/safeStorage.native.js +23 -24
- package/dist/cjs/safeStorage.native.js.map +1 -1
- package/dist/cjs/systemScheme.cjs +24 -26
- package/dist/cjs/systemScheme.native.cjs +59 -0
- package/dist/cjs/systemScheme.native.js +38 -41
- package/dist/cjs/systemScheme.native.js.map +1 -1
- package/dist/cjs/userScheme.cjs +104 -106
- package/dist/cjs/userScheme.native.cjs +169 -0
- package/dist/cjs/userScheme.native.js +116 -116
- package/dist/cjs/userScheme.native.js.map +1 -1
- package/dist/cjs/userSchemeAppearance.cjs +17 -19
- package/dist/cjs/userSchemeAppearance.native.cjs +39 -0
- package/dist/cjs/userSchemeAppearance.native.js +19 -20
- package/dist/cjs/userSchemeAppearance.native.js.map +1 -1
- package/dist/esm/index.js +44 -64
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/index.mjs +44 -64
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/index.native.js +28 -44
- package/dist/esm/index.native.js.map +1 -1
- package/dist/esm/safeStorage.mjs +9 -8
- package/dist/esm/safeStorage.mjs.map +1 -1
- package/dist/esm/safeStorage.native.js +9 -8
- package/dist/esm/safeStorage.native.js.map +1 -1
- package/dist/esm/systemScheme.mjs +11 -9
- package/dist/esm/systemScheme.mjs.map +1 -1
- package/dist/esm/systemScheme.native.js +27 -27
- package/dist/esm/systemScheme.native.js.map +1 -1
- package/dist/esm/userScheme.mjs +87 -85
- package/dist/esm/userScheme.mjs.map +1 -1
- package/dist/esm/userScheme.native.js +99 -96
- package/dist/esm/userScheme.native.js.map +1 -1
- package/dist/esm/userSchemeAppearance.mjs +3 -1
- package/dist/esm/userSchemeAppearance.mjs.map +1 -1
- package/dist/esm/userSchemeAppearance.native.js +5 -3
- package/dist/esm/userSchemeAppearance.native.js.map +1 -1
- package/package.json +3 -3
- package/dist/cjs/safeStorage.test.cjs +0 -49
- package/dist/cjs/safeStorage.test.native.js +0 -66
- package/dist/cjs/safeStorage.test.native.js.map +0 -1
- package/dist/esm/safeStorage.test.mjs +0 -50
- package/dist/esm/safeStorage.test.mjs.map +0 -1
- package/dist/esm/safeStorage.test.native.js +0 -64
- package/dist/esm/safeStorage.test.native.js.map +0 -1
- package/types/safeStorage.test.d.ts +0 -2
- package/types/safeStorage.test.d.ts.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"userScheme.native.js","names":[],"sources":["esm/userScheme.native.js"],"sourcesContent":["import { useIsomorphicLayoutEffect } from \"@vxrn/use-isomorphic-layout-effect\";\nimport { useMemo, useState } from \"react\";\nimport { getStorageItem, setStorageItem } from \"./safeStorage\";\nimport { addAppearanceChangeListener, getAppearanceScheme, setAppearanceScheme } from \"./userSchemeAppearance\";\n\nvar listeners = /* @__PURE__ */ new Set();\nvar storageKey = \"vxrn-scheme\";\nvar _forceScheme = null;\nfunction notifyListeners() {\n\tlisteners.forEach(function(listener) {\n\t\tlistener(currentSetting, currentValue);\n\t});\n}\nfunction restoreUnforcedScheme() {\n\tvar stored = getStorageItem(storageKey);\n\tif (stored) {\n\t\tcurrentSetting = stored;\n\t\tcurrentValue = stored === \"system\" ? resolveValue(\"system\") : stored;\n\t\treturn;\n\t}\n\tcurrentSetting = \"system\";\n\tcurrentValue = resolveValue(\"system\");\n}\nfunction setForceScheme(scheme) {\n\tvar wasForced = _forceScheme;\n\tif (wasForced === scheme) return;\n\t_forceScheme = scheme;\n\tif (scheme) {\n\t\tcurrentSetting = scheme;\n\t\tcurrentValue = scheme;\n\t} else if (wasForced) {\n\t\trestoreUnforcedScheme();\n\t\tstartWebListener();\n\t}\n}\nfunction getForceScheme() {\n\treturn _forceScheme;\n}\nfunction getInitialSetting() {\n\tvar stored = getStorageItem(storageKey);\n\tif (stored === \"light\" || stored === \"dark\" || stored === \"system\") return stored;\n\treturn \"system\";\n}\nfunction getInitialValue(setting) {\n\tif (setting === \"system\") return getAppearanceScheme();\n\treturn setting;\n}\nvar initialSetting = getInitialSetting();\nvar currentSetting = initialSetting;\nvar currentValue = getInitialValue(initialSetting);\naddAppearanceChangeListener(function() {\n\tif (currentSetting === \"system\") updateValueFromSystem();\n});\nvar isWebListening = false;\nfunction startWebListener() {\n\tvar _window_matchMedia, _window, _matcher_addEventListener;\n\tif (isWebListening) return;\n\tisWebListening = true;\n\tvar matcher = typeof window !== \"undefined\" ? (_window_matchMedia = (_window = window).matchMedia) === null || _window_matchMedia === void 0 ? void 0 : _window_matchMedia.call(_window, \"(prefers-color-scheme: dark)\") : null;\n\tvar onSystemChange = function() {\n\t\tif (currentSetting === \"system\") updateValueFromSystem();\n\t};\n\tonSystemChange();\n\tmatcher === null || matcher === void 0 || (_matcher_addEventListener = matcher.addEventListener) == null || _matcher_addEventListener.call(matcher, \"change\", onSystemChange);\n}\nfunction resolveValue(setting) {\n\tif (setting === \"system\") return getAppearanceScheme();\n\treturn setting;\n}\nfunction updateValueFromSystem() {\n\tif (_forceScheme) return;\n\tvar value = resolveValue(\"system\");\n\tif (value !== currentValue) {\n\t\tcurrentValue = value;\n\t\tnotifyListeners();\n\t}\n}\nfunction updateScheme(setting) {\n\tif (_forceScheme) return;\n\tvar value = setting === \"system\" ? resolveValue(\"system\") : setting;\n\tif (value !== currentValue || currentSetting !== setting) {\n\t\tcurrentSetting = setting;\n\t\tcurrentValue = value;\n\t\tif (setting !== \"system\") setAppearanceScheme(value);\n\t\telse setAppearanceScheme(\"unspecified\");\n\t\tnotifyListeners();\n\t}\n}\nfunction setUserScheme(setting) {\n\tif (_forceScheme) return;\n\tsetStorageItem(storageKey, setting);\n\tupdateScheme(setting);\n}\nfunction getUserScheme() {\n\tif (_forceScheme) return {\n\t\tsetting: _forceScheme,\n\t\tvalue: _forceScheme\n\t};\n\treturn {\n\t\tsetting: currentSetting,\n\t\tvalue: currentValue\n\t};\n}\nfunction onUserSchemeChange(listener) {\n\tlisteners.add(listener);\n\tlistener(currentSetting, currentValue);\n\treturn function() {\n\t\tlisteners.delete(listener);\n\t};\n}\nfunction useUserScheme() {\n\tvar [state, setState] = useState(function() {\n\t\treturn getUserScheme();\n\t});\n\tvar snapshot = getUserScheme();\n\tvar resolvedState = state.setting === snapshot.setting && state.value === snapshot.value ? state : snapshot;\n\tuseIsomorphicLayoutEffect(function() {\n\t\tif (!_forceScheme) {\n\t\t\tvar stored = getStorageItem(storageKey);\n\t\t\tif (stored) updateScheme(stored);\n\t\t\tstartWebListener();\n\t\t}\n\t\treturn onUserSchemeChange(function(setting, value) {\n\t\t\tsetState({\n\t\t\t\tsetting,\n\t\t\t\tvalue\n\t\t\t});\n\t\t});\n\t}, []);\n\treturn useMemo(function() {\n\t\treturn {\n\t\t\tsetting: resolvedState.setting,\n\t\t\tvalue: resolvedState.value,\n\t\t\tset: setUserScheme\n\t\t};\n\t}, [resolvedState.setting, resolvedState.value]);\n}\n\nexport { getForceScheme, getUserScheme, onUserSchemeChange, setForceScheme, setUserScheme, useUserScheme };"],"mappings":"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"}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { getSystemScheme } from "./systemScheme.mjs";
|
|
2
|
+
|
|
2
3
|
function getAppearanceScheme() {
|
|
3
|
-
|
|
4
|
+
return getSystemScheme();
|
|
4
5
|
}
|
|
5
6
|
function setAppearanceScheme(_scheme) {}
|
|
6
7
|
function addAppearanceChangeListener(_listener) {}
|
|
8
|
+
|
|
7
9
|
export { addAppearanceChangeListener, getAppearanceScheme, setAppearanceScheme };
|
|
8
10
|
//# sourceMappingURL=userSchemeAppearance.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"userSchemeAppearance.js","names":[],"sources":["esm/userSchemeAppearance.js"],"sourcesContent":["import { getSystemScheme } from \"./systemScheme\";\nfunction getAppearanceScheme() {\n return getSystemScheme();\n}\nfunction setAppearanceScheme(_scheme) {\n}\nfunction addAppearanceChangeListener(_listener) {\n}\nexport {\n addAppearanceChangeListener,\n getAppearanceScheme,\n setAppearanceScheme\n};\n//# sourceMappingURL=userSchemeAppearance.js.map\n"],"mappings":";;;AACA,SAAS,sBAAsB;CAC7B,OAAO,gBAAgB;AACzB;AACA,SAAS,oBAAoB,SAAS,CACtC;AACA,SAAS,4BAA4B,WAAW,CAChD"}
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import { Appearance } from "react-native";
|
|
2
|
+
|
|
2
3
|
function getAppearanceScheme() {
|
|
3
|
-
|
|
4
|
+
return Appearance.getColorScheme() === "dark" ? "dark" : "light";
|
|
4
5
|
}
|
|
5
6
|
function setAppearanceScheme(scheme) {
|
|
6
|
-
|
|
7
|
+
Appearance.setColorScheme(scheme);
|
|
7
8
|
}
|
|
8
9
|
function addAppearanceChangeListener(listener) {
|
|
9
|
-
|
|
10
|
+
Appearance.addChangeListener(listener);
|
|
10
11
|
}
|
|
12
|
+
|
|
11
13
|
export { addAppearanceChangeListener, getAppearanceScheme, setAppearanceScheme };
|
|
12
14
|
//# sourceMappingURL=userSchemeAppearance.native.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"userSchemeAppearance.native.js","names":[],"sources":["esm/userSchemeAppearance.native.js"],"sourcesContent":["import { Appearance } from \"react-native\";\nfunction getAppearanceScheme() {\n return Appearance.getColorScheme() === \"dark\" ? \"dark\" : \"light\";\n}\nfunction setAppearanceScheme(scheme) {\n Appearance.setColorScheme(scheme);\n}\nfunction addAppearanceChangeListener(listener) {\n Appearance.addChangeListener(listener);\n}\nexport {\n addAppearanceChangeListener,\n getAppearanceScheme,\n setAppearanceScheme\n};\n//# sourceMappingURL=userSchemeAppearance.native.js.map\n"],"mappings":";;;AACA,SAAS,sBAAsB;CAC7B,OAAO,WAAW,eAAe,MAAM,SAAS,SAAS;AAC3D;AACA,SAAS,oBAAoB,QAAQ;CACnC,WAAW,eAAe,MAAM;AAClC;AACA,SAAS,4BAA4B,UAAU;CAC7C,WAAW,kBAAkB,QAAQ;AACvC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vxrn/color-scheme",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0-beta.45.1",
|
|
4
4
|
"sideEffects": false,
|
|
5
5
|
"exports": {
|
|
6
6
|
"./package.json": "./package.json",
|
|
@@ -31,10 +31,10 @@
|
|
|
31
31
|
"watch": "tamagui-build --watch"
|
|
32
32
|
},
|
|
33
33
|
"dependencies": {
|
|
34
|
-
"@vxrn/use-isomorphic-layout-effect": "
|
|
34
|
+
"@vxrn/use-isomorphic-layout-effect": "2.0.0-beta.45.1"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
|
-
"@tamagui/build": "
|
|
37
|
+
"@tamagui/build": "3.0.0-beta.1309.1",
|
|
38
38
|
"react": "19.2.3",
|
|
39
39
|
"react-native": "0.86.2",
|
|
40
40
|
"vitest": "^4.1.0"
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
var import_vitest = require("vitest");
|
|
2
|
-
var import_safeStorage = require("./safeStorage.cjs");
|
|
3
|
-
(0, import_vitest.afterEach)(() => {
|
|
4
|
-
delete globalThis.localStorage;
|
|
5
|
-
});
|
|
6
|
-
function defineLocalStorage(descriptor) {
|
|
7
|
-
Object.defineProperty(globalThis, "localStorage", {
|
|
8
|
-
configurable: true,
|
|
9
|
-
...descriptor
|
|
10
|
-
});
|
|
11
|
-
}
|
|
12
|
-
(0, import_vitest.describe)("safeStorage", () => {
|
|
13
|
-
(0, import_vitest.it)("reads and writes through to a working localStorage", () => {
|
|
14
|
-
const store = /* @__PURE__ */new Map();
|
|
15
|
-
defineLocalStorage({
|
|
16
|
-
value: {
|
|
17
|
-
getItem: k => store.has(k) ? store.get(k) : null,
|
|
18
|
-
setItem: (k, v) => void store.set(k, v)
|
|
19
|
-
}
|
|
20
|
-
});
|
|
21
|
-
(0, import_safeStorage.setStorageItem)("vxrn-scheme", "dark");
|
|
22
|
-
(0, import_vitest.expect)((0, import_safeStorage.getStorageItem)("vxrn-scheme")).toBe("dark");
|
|
23
|
-
});
|
|
24
|
-
(0, import_vitest.it)("returns null instead of throwing when the localStorage getter throws", () => {
|
|
25
|
-
defineLocalStorage({
|
|
26
|
-
get() {
|
|
27
|
-
throw new Error('Failed to read the "localStorage" property: Access is denied.');
|
|
28
|
-
}
|
|
29
|
-
});
|
|
30
|
-
(0, import_vitest.expect)(() => (0, import_safeStorage.getStorageItem)("vxrn-scheme")).not.toThrow();
|
|
31
|
-
(0, import_vitest.expect)((0, import_safeStorage.getStorageItem)("vxrn-scheme")).toBeNull();
|
|
32
|
-
(0, import_vitest.expect)(() => (0, import_safeStorage.setStorageItem)("vxrn-scheme", "dark")).not.toThrow();
|
|
33
|
-
});
|
|
34
|
-
(0, import_vitest.it)("swallows errors when setItem throws (quota / blocked)", () => {
|
|
35
|
-
defineLocalStorage({
|
|
36
|
-
value: {
|
|
37
|
-
getItem: () => null,
|
|
38
|
-
setItem: () => {
|
|
39
|
-
throw new Error("QuotaExceededError");
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
});
|
|
43
|
-
(0, import_vitest.expect)(() => (0, import_safeStorage.setStorageItem)("vxrn-scheme", "dark")).not.toThrow();
|
|
44
|
-
});
|
|
45
|
-
(0, import_vitest.it)("returns null when localStorage is undefined (native)", () => {
|
|
46
|
-
(0, import_vitest.expect)((0, import_safeStorage.getStorageItem)("vxrn-scheme")).toBeNull();
|
|
47
|
-
(0, import_vitest.expect)(() => (0, import_safeStorage.setStorageItem)("vxrn-scheme", "dark")).not.toThrow();
|
|
48
|
-
});
|
|
49
|
-
});
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var import_vitest = require("vitest");
|
|
4
|
-
var import_safeStorage = require("./safeStorage.native.js");
|
|
5
|
-
(0, import_vitest.afterEach)(function () {
|
|
6
|
-
delete globalThis.localStorage;
|
|
7
|
-
});
|
|
8
|
-
function defineLocalStorage(descriptor) {
|
|
9
|
-
Object.defineProperty(globalThis, "localStorage", {
|
|
10
|
-
configurable: true,
|
|
11
|
-
...descriptor
|
|
12
|
-
});
|
|
13
|
-
}
|
|
14
|
-
(0, import_vitest.describe)("safeStorage", function () {
|
|
15
|
-
(0, import_vitest.it)("reads and writes through to a working localStorage", function () {
|
|
16
|
-
var store = /* @__PURE__ */new Map();
|
|
17
|
-
defineLocalStorage({
|
|
18
|
-
value: {
|
|
19
|
-
getItem: function (k) {
|
|
20
|
-
return store.has(k) ? store.get(k) : null;
|
|
21
|
-
},
|
|
22
|
-
setItem: function (k, v) {
|
|
23
|
-
return void store.set(k, v);
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
});
|
|
27
|
-
(0, import_safeStorage.setStorageItem)("vxrn-scheme", "dark");
|
|
28
|
-
(0, import_vitest.expect)((0, import_safeStorage.getStorageItem)("vxrn-scheme")).toBe("dark");
|
|
29
|
-
});
|
|
30
|
-
(0, import_vitest.it)("returns null instead of throwing when the localStorage getter throws", function () {
|
|
31
|
-
defineLocalStorage({
|
|
32
|
-
get() {
|
|
33
|
-
throw new Error('Failed to read the "localStorage" property: Access is denied.');
|
|
34
|
-
}
|
|
35
|
-
});
|
|
36
|
-
(0, import_vitest.expect)(function () {
|
|
37
|
-
return (0, import_safeStorage.getStorageItem)("vxrn-scheme");
|
|
38
|
-
}).not.toThrow();
|
|
39
|
-
(0, import_vitest.expect)((0, import_safeStorage.getStorageItem)("vxrn-scheme")).toBeNull();
|
|
40
|
-
(0, import_vitest.expect)(function () {
|
|
41
|
-
return (0, import_safeStorage.setStorageItem)("vxrn-scheme", "dark");
|
|
42
|
-
}).not.toThrow();
|
|
43
|
-
});
|
|
44
|
-
(0, import_vitest.it)("swallows errors when setItem throws (quota / blocked)", function () {
|
|
45
|
-
defineLocalStorage({
|
|
46
|
-
value: {
|
|
47
|
-
getItem: function () {
|
|
48
|
-
return null;
|
|
49
|
-
},
|
|
50
|
-
setItem: function () {
|
|
51
|
-
throw new Error("QuotaExceededError");
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
});
|
|
55
|
-
(0, import_vitest.expect)(function () {
|
|
56
|
-
return (0, import_safeStorage.setStorageItem)("vxrn-scheme", "dark");
|
|
57
|
-
}).not.toThrow();
|
|
58
|
-
});
|
|
59
|
-
(0, import_vitest.it)("returns null when localStorage is undefined (native)", function () {
|
|
60
|
-
(0, import_vitest.expect)((0, import_safeStorage.getStorageItem)("vxrn-scheme")).toBeNull();
|
|
61
|
-
(0, import_vitest.expect)(function () {
|
|
62
|
-
return (0, import_safeStorage.setStorageItem)("vxrn-scheme", "dark");
|
|
63
|
-
}).not.toThrow();
|
|
64
|
-
});
|
|
65
|
-
});
|
|
66
|
-
//# sourceMappingURL=safeStorage.test.native.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["import_vitest","require","import_safeStorage","afterEach","globalThis","localStorage","defineLocalStorage","descriptor","Object","defineProperty","configurable","describe","it","store","Map","value","getItem","k","has","get","setItem","v","set","setStorageItem","expect","getStorageItem","toBe","Error","not","toThrow","toBeNull"],"sources":["../../src/safeStorage.test.ts"],"sourcesContent":[null],"mappings":"AAAA;;AACA,IAAAA,aAAA,GAAAC,OAA+C;AAAA,IAI/CC,kBAAA,GAAAD,OAAU,0BAAM;AACd,IAAAD,aAAQ,CAAAG,SAAmB;EAC5B,OAAAC,UAAA,CAAAC,YAAA;AAED;AACE,SAAOC,kBAAeA,CAAAC,UAAY;EAAgBC,MAChD,CAAAC,cAAc,CAAAL,UAAA;IACdM,YAAG;IACJ,GAAAH;EACH;AAAA;AAGE,IAAAP,aAAA,CAAAW,QAAG;EACD,IAAAX,aAAc,CAAAY,EAAA,sDAAwB;IACtC,IAAAC,KAAA,kBAAmB,IAAAC,GAAA;IAAAR,kBACV;MAAAS,KACL;QACAC,OAAA,EAAS,SAAAA,CAAYC,CAAc;UACrC,OAAAJ,KAAA,CAAAK,GAAA,CAAAD,CAAA,IAAAJ,KAAA,CAAAM,GAAA,CAAAF,CAAA;QACD;QAEDG,OAAA,WAAAA,CAAAH,CAAA,EAAAI,CAAA;UACA,YAAAR,KAAA,CAAAS,GAAA,CAAAL,CAAA,EAAOI,CAAA;QACR;MAKD;IACE;IAAmB,EACjB,EAAAnB,kBAAM,CAAAqB,cAAA;IACJ,IAAAvB,aAAU,CAAAwB,MAAM,MAAAtB,kBAAA,CAAAuB,cAAA,kBAAAC,IAA+D;EAAA;EACjF,EACF,EAAC1B,aAAA,CAAAY,EAAA;IAEDN,kBAAA;MACAa,IAAA;QACA,UAAAQ,KAAA,gEAA4B;MAC7B;IAED;IACE,IAAA3B,aAAA,CAAAwB,MAAmB;MACjB,OAAO,IAAAtB,kBAAA,CAAAuB,cAAA;IAAA,GAAAG,GACL,CAAAC,OAAS;IAAM,IACf7B,aAAS,CAAAwB,MAAM,MAAAtB,kBAAA,CAAAuB,cAAA,kBAAAK,QAAA;IACb,IAAA9B,aAAU,CAAAwB,MAAM;MAAoB,OACtC,IAAAtB,kBAAA,CAAAqB,cAAA;IAAA,EACF,CAAAK,GAAA,CAAAC,OAAA;EAAA,EACF;EAEA,IAAA7B,aAAA,CAAAY,EAAA,yDAA4B,cAAe;IAC5CN,kBAAA;MAEDS,KAAA;QACEC,OAAA,WAAAA,CAAA;UACA;QACD;QACFI,OAAA,WAAAA,CAAA","ignoreList":[]}
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import { afterEach, describe, expect, it } from "vitest";
|
|
2
|
-
import { getStorageItem, setStorageItem } from "./safeStorage.mjs";
|
|
3
|
-
afterEach(() => {
|
|
4
|
-
delete globalThis.localStorage;
|
|
5
|
-
});
|
|
6
|
-
function defineLocalStorage(descriptor) {
|
|
7
|
-
Object.defineProperty(globalThis, "localStorage", {
|
|
8
|
-
configurable: true,
|
|
9
|
-
...descriptor
|
|
10
|
-
});
|
|
11
|
-
}
|
|
12
|
-
describe("safeStorage", () => {
|
|
13
|
-
it("reads and writes through to a working localStorage", () => {
|
|
14
|
-
const store = /* @__PURE__ */new Map();
|
|
15
|
-
defineLocalStorage({
|
|
16
|
-
value: {
|
|
17
|
-
getItem: k => store.has(k) ? store.get(k) : null,
|
|
18
|
-
setItem: (k, v) => void store.set(k, v)
|
|
19
|
-
}
|
|
20
|
-
});
|
|
21
|
-
setStorageItem("vxrn-scheme", "dark");
|
|
22
|
-
expect(getStorageItem("vxrn-scheme")).toBe("dark");
|
|
23
|
-
});
|
|
24
|
-
it("returns null instead of throwing when the localStorage getter throws", () => {
|
|
25
|
-
defineLocalStorage({
|
|
26
|
-
get() {
|
|
27
|
-
throw new Error('Failed to read the "localStorage" property: Access is denied.');
|
|
28
|
-
}
|
|
29
|
-
});
|
|
30
|
-
expect(() => getStorageItem("vxrn-scheme")).not.toThrow();
|
|
31
|
-
expect(getStorageItem("vxrn-scheme")).toBeNull();
|
|
32
|
-
expect(() => setStorageItem("vxrn-scheme", "dark")).not.toThrow();
|
|
33
|
-
});
|
|
34
|
-
it("swallows errors when setItem throws (quota / blocked)", () => {
|
|
35
|
-
defineLocalStorage({
|
|
36
|
-
value: {
|
|
37
|
-
getItem: () => null,
|
|
38
|
-
setItem: () => {
|
|
39
|
-
throw new Error("QuotaExceededError");
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
});
|
|
43
|
-
expect(() => setStorageItem("vxrn-scheme", "dark")).not.toThrow();
|
|
44
|
-
});
|
|
45
|
-
it("returns null when localStorage is undefined (native)", () => {
|
|
46
|
-
expect(getStorageItem("vxrn-scheme")).toBeNull();
|
|
47
|
-
expect(() => setStorageItem("vxrn-scheme", "dark")).not.toThrow();
|
|
48
|
-
});
|
|
49
|
-
});
|
|
50
|
-
//# sourceMappingURL=safeStorage.test.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["afterEach","describe","expect","it","getStorageItem","setStorageItem","globalThis","localStorage","defineLocalStorage","descriptor","Object","defineProperty","configurable","store","Map","value","getItem","k","has","get","setItem","v","set","toBe","Error","not","toThrow","toBeNull"],"sources":["../../src/safeStorage.test.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,SAAA,EAAWC,QAAA,EAAUC,MAAA,EAAQC,EAAA,QAAU;AAChD,SAASC,cAAA,EAAgBC,cAAA,QAAsB;AAI/CL,SAAA,CAAU,MAAM;EACd,OAAQM,UAAA,CAAmBC,YAAA;AAC7B,CAAC;AAED,SAASC,mBAAmBC,UAAA,EAAgC;EAC1DC,MAAA,CAAOC,cAAA,CAAeL,UAAA,EAAY,gBAAgB;IAChDM,YAAA,EAAc;IACd,GAAGH;EACL,CAAC;AACH;AAEAR,QAAA,CAAS,eAAe,MAAM;EAC5BE,EAAA,CAAG,sDAAsD,MAAM;IAC7D,MAAMU,KAAA,GAAQ,mBAAIC,GAAA,CAAoB;IACtCN,kBAAA,CAAmB;MACjBO,KAAA,EAAO;QACLC,OAAA,EAAUC,CAAA,IAAeJ,KAAA,CAAMK,GAAA,CAAID,CAAC,IAAIJ,KAAA,CAAMM,GAAA,CAAIF,CAAC,IAAK;QACxDG,OAAA,EAASA,CAACH,CAAA,EAAWI,CAAA,KAAc,KAAKR,KAAA,CAAMS,GAAA,CAAIL,CAAA,EAAGI,CAAC;MACxD;IACF,CAAC;IAEDhB,cAAA,CAAe,eAAe,MAAM;IACpCH,MAAA,CAAOE,cAAA,CAAe,aAAa,CAAC,EAAEmB,IAAA,CAAK,MAAM;EACnD,CAAC;EAKDpB,EAAA,CAAG,wEAAwE,MAAM;IAC/EK,kBAAA,CAAmB;MACjBW,IAAA,EAAM;QACJ,MAAM,IAAIK,KAAA,CAAM,+DAA+D;MACjF;IACF,CAAC;IAEDtB,MAAA,CAAO,MAAME,cAAA,CAAe,aAAa,CAAC,EAAEqB,GAAA,CAAIC,OAAA,CAAQ;IACxDxB,MAAA,CAAOE,cAAA,CAAe,aAAa,CAAC,EAAEuB,QAAA,CAAS;IAC/CzB,MAAA,CAAO,MAAMG,cAAA,CAAe,eAAe,MAAM,CAAC,EAAEoB,GAAA,CAAIC,OAAA,CAAQ;EAClE,CAAC;EAEDvB,EAAA,CAAG,yDAAyD,MAAM;IAChEK,kBAAA,CAAmB;MACjBO,KAAA,EAAO;QACLC,OAAA,EAASA,CAAA,KAAM;QACfI,OAAA,EAASA,CAAA,KAAM;UACb,MAAM,IAAII,KAAA,CAAM,oBAAoB;QACtC;MACF;IACF,CAAC;IAEDtB,MAAA,CAAO,MAAMG,cAAA,CAAe,eAAe,MAAM,CAAC,EAAEoB,GAAA,CAAIC,OAAA,CAAQ;EAClE,CAAC;EAEDvB,EAAA,CAAG,wDAAwD,MAAM;IAC/DD,MAAA,CAAOE,cAAA,CAAe,aAAa,CAAC,EAAEuB,QAAA,CAAS;IAC/CzB,MAAA,CAAO,MAAMG,cAAA,CAAe,eAAe,MAAM,CAAC,EAAEoB,GAAA,CAAIC,OAAA,CAAQ;EAClE,CAAC;AACH,CAAC","ignoreList":[]}
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
import { afterEach, describe, expect, it } from "vitest";
|
|
2
|
-
import { getStorageItem, setStorageItem } from "./safeStorage.native.js";
|
|
3
|
-
afterEach(function () {
|
|
4
|
-
delete globalThis.localStorage;
|
|
5
|
-
});
|
|
6
|
-
function defineLocalStorage(descriptor) {
|
|
7
|
-
Object.defineProperty(globalThis, "localStorage", {
|
|
8
|
-
configurable: true,
|
|
9
|
-
...descriptor
|
|
10
|
-
});
|
|
11
|
-
}
|
|
12
|
-
describe("safeStorage", function () {
|
|
13
|
-
it("reads and writes through to a working localStorage", function () {
|
|
14
|
-
var store = /* @__PURE__ */new Map();
|
|
15
|
-
defineLocalStorage({
|
|
16
|
-
value: {
|
|
17
|
-
getItem: function (k) {
|
|
18
|
-
return store.has(k) ? store.get(k) : null;
|
|
19
|
-
},
|
|
20
|
-
setItem: function (k, v) {
|
|
21
|
-
return void store.set(k, v);
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
});
|
|
25
|
-
setStorageItem("vxrn-scheme", "dark");
|
|
26
|
-
expect(getStorageItem("vxrn-scheme")).toBe("dark");
|
|
27
|
-
});
|
|
28
|
-
it("returns null instead of throwing when the localStorage getter throws", function () {
|
|
29
|
-
defineLocalStorage({
|
|
30
|
-
get() {
|
|
31
|
-
throw new Error('Failed to read the "localStorage" property: Access is denied.');
|
|
32
|
-
}
|
|
33
|
-
});
|
|
34
|
-
expect(function () {
|
|
35
|
-
return getStorageItem("vxrn-scheme");
|
|
36
|
-
}).not.toThrow();
|
|
37
|
-
expect(getStorageItem("vxrn-scheme")).toBeNull();
|
|
38
|
-
expect(function () {
|
|
39
|
-
return setStorageItem("vxrn-scheme", "dark");
|
|
40
|
-
}).not.toThrow();
|
|
41
|
-
});
|
|
42
|
-
it("swallows errors when setItem throws (quota / blocked)", function () {
|
|
43
|
-
defineLocalStorage({
|
|
44
|
-
value: {
|
|
45
|
-
getItem: function () {
|
|
46
|
-
return null;
|
|
47
|
-
},
|
|
48
|
-
setItem: function () {
|
|
49
|
-
throw new Error("QuotaExceededError");
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
});
|
|
53
|
-
expect(function () {
|
|
54
|
-
return setStorageItem("vxrn-scheme", "dark");
|
|
55
|
-
}).not.toThrow();
|
|
56
|
-
});
|
|
57
|
-
it("returns null when localStorage is undefined (native)", function () {
|
|
58
|
-
expect(getStorageItem("vxrn-scheme")).toBeNull();
|
|
59
|
-
expect(function () {
|
|
60
|
-
return setStorageItem("vxrn-scheme", "dark");
|
|
61
|
-
}).not.toThrow();
|
|
62
|
-
});
|
|
63
|
-
});
|
|
64
|
-
//# sourceMappingURL=safeStorage.test.native.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["afterEach","describe","expect","it","getStorageItem","setStorageItem","globalThis","localStorage","defineLocalStorage","descriptor","Object","defineProperty","configurable","store","Map","value","getItem","k","has","get","setItem","v","set","toBe","Error","not","toThrow","toBeNull"],"sources":["../../src/safeStorage.test.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,SAAA,EAAWC,QAAA,EAAUC,MAAA,EAAQC,EAAA,QAAU;AAChD,SAASC,cAAA,EAAgBC,cAAA,QAAsB;AAI/CL,SAAA,CAAU,YAAM;EACd,OAAQM,UAAA,CAAmBC,YAAA;AAC7B,CAAC;AAED,SAASC,mBAAmBC,UAAA,EAAgC;EAC1DC,MAAA,CAAOC,cAAA,CAAeL,UAAA,EAAY,gBAAgB;IAChDM,YAAA,EAAc;IACd,GAAGH;EACL,CAAC;AACH;AAEAR,QAAA,CAAS,eAAe,YAAM;EAC5BE,EAAA,CAAG,sDAAsD,YAAM;IAC7D,IAAAU,KAAM,kBAAQ,IAAAC,GAAI;IAClBN,kBAAA,CAAmB;MACjBO,KAAA,EAAO;QACLC,OAAA,EAAS,SAAAA,CAAgBC,CAAA;UACzB,OAASJ,KAAY,CAAAK,GAAA,CAAcD,CAAA,IAAKJ,KAAA,CAAMM,GAAA,CAAIF,CAAA,IAAI;QACxD;QACDG,OAAA,WAAAA,CAAAH,CAAA,EAAAI,CAAA;UAED,YAAeR,KAAA,CAAAS,GAAA,CAAAL,CAAA,EAAeI,CAAA;QAC9B;MACD;IAKD,CAAG;IACDhB,cAAA,cAAmB;IAAAH,MACjB,CAAAE,cAAM,iBAAAmB,IAAA;EACJ;EAA+EpB,EAAA,uEACjF;IACFK,kBAAC;MAEDW,IAAA,EAAO;QACP,MAAO,IAAAK,KAAA,gEAAwC;MAC/C;IACD;IAEDtB,MAAG;MACD,OAAAE,cAAmB;IAAA,EACjB,CAAAqB,GAAA,CAAAC,OAAO;IAAAxB,MACL,CAAAE,cAAe,iBAAAuB,QAAA;IAAAzB,MACf,aAAS;MACP,OAAAG,cAAgB,sBAAoB;IAAA,GAAAoB,GACtC,CAAAC,OAAA;EAAA;EACFvB,EACF,CAAC;IAEDK,kBAAa;MACdO,KAAA;QAEEC,OAAA,WAAAA,CAAA;UACD,OAAO;QACP;QACDI,OAAA,WAAAA,CAAA;UACF,UAAAI,KAAA","ignoreList":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"safeStorage.test.d.ts","sourceRoot":"","sources":["../src/safeStorage.test.ts"],"names":[],"mappings":""}
|