@koine/browser 2.0.0-beta.71 → 2.0.0-beta.73

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 @@
1
+ import{decode as e,encode as t,isBrowser as o,isNullOrUndefined as r,noop as s}from"@koine/utils";import{on as l}from"@koine/dom";import{storage as i}from"./storage";export let createStorage=(n,a)=>{let c=a?i.s:i.l,m=Object.keys(n).reduce((e,o)=>({...e,[o]:t(o)}),{});return{get:(t,o)=>c.get(m[t],e,o),getAll(e){if(!o)return"development"===process.env.NODE_ENV&&console.log("[@koine/utils:createStorage] attempt to use 'getAll' outside of browser."),{};let t={};for(let o in m){let s=this.get(o),l=e?.[o];r(s)?l&&(t[o]=l):t[o]=s}return t},set(e,o){c.set(m[e],o,t)},setMany(e){if("development"!==process.env.NODE_ENV||o||console.log("[@koine/utils:createStorage] attempt to use 'setMany' outside of browser."),o)for(let t in e){let o=e[t];r(o)?this.remove(t):this.set(t,o)}},has:e=>c.has(m[e]),remove(e){c.remove(m[e])},clear(){if("development"!==process.env.NODE_ENV||o||console.log("[@koine/utils:createStorage] attempt to use 'clear' outside of browser."),o)for(let e in m)c.remove(m[e])},watch:(e,t,r)=>o?l(window,"storage",o=>{let{key:s,oldValue:l,newValue:i}=o;s===m[e]&&(l&&!i?t?.():!l&&i&&r?.())}):("development"===process.env.NODE_ENV&&console.log("[@koine/utils:createStorage] attempt to use 'watch' outside of browser."),s)}};
@@ -0,0 +1 @@
1
+ import{isBrowser as e}from"@koine/utils";let t=(e,t)=>e;export let getZonedDate=(o="",n)=>{if(o.endsWith("Z")||(o+="Z"),!n&&e)try{n=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(e){"development"===process.env.NODE_ENV&&console.warn("[@koine/browser:getZonedDate] failed reading timeZone, error",e)}return n?t(new Date(o),n):new Date(o)};
@@ -0,0 +1 @@
1
+ import{isUndefined as o,noop as t}from"@koine/utils";export let gtag=(...g)=>{o(window)||o(window.gtag)?t():window.gtag(...g)};
@@ -0,0 +1 @@
1
+ import{gtag as e}from"./gtag";export let gtagPageview=(...t)=>e("event","page_view",{page_path:t[0]||location.pathname,page_title:t[1]||document.title,page_location:t[2]||location.href});
@@ -0,0 +1 @@
1
+ export{createStorage}from"./createStorage";export{getZonedDate}from"./getZonedDate";export{gtag}from"./gtag";export{gtagPageview}from"./gtagPageview";export{isIE}from"./isIE";export{isMobile}from"./isMobile";export{listenUrlSearch}from"./listenUrlSearch";export{listenUrlSearchParams}from"./listenUrlSearchParams";export{navigateToHash}from"./navigateToHash";export{navigateToHashParams}from"./navigateToHashParams";export{navigateToMergedHashParams}from"./navigateToMergedHashParams";export{navigateToMergedParams}from"./navigateToMergedParams";export{navigateToParams}from"./navigateToParams";export{navigateToUrl}from"./navigateToUrl";export{navigateWithoutUrlParam}from"./navigateWithoutUrlParam";export{redirectTo}from"./redirectTo";export{storage}from"./storage";export{storageClient}from"./storageClient";
@@ -0,0 +1 @@
1
+ import{isServer as e}from"@koine/utils";export let isIE=(i=!0)=>{if(e)return i;let r=window.navigator.userAgent;return!!(r.indexOf("MSIE ")>0||r.indexOf("Trident/")>0)};
@@ -0,0 +1 @@
1
+ import{isServer as i}from"@koine/utils";export let isMobile=(e=!0)=>i?e:/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(window.navigator.userAgent);
@@ -0,0 +1 @@
1
+ import{isBrowser as t}from"@koine/utils";import{on as e}from"@koine/dom";let o=(t,e,o)=>function(...r){if(o)return e(),t.apply(this,r);let i=t.apply(this,r);return e(),i},r=t?location.search:"",i=()=>{let t=location.search;if(t!==r)for(let e of history.__.h.values())e(r,t);r=t};export let listenUrlSearch=t=>(history.__||(history.pushState=o(history.pushState,i),history.replaceState=o(history.replaceState,i),e(window,"popstate",i),history.__={h:new Set}),history.__.h.has(t)||history.__.h.add(t),()=>{history.__.h.delete(t)});
@@ -0,0 +1 @@
1
+ import{listenUrlSearch as e}from"./listenUrlSearch";export let listenUrlSearchParams=(r,a)=>e((e,t)=>{let l=new URLSearchParams(e),m=new URLSearchParams(t).get(r);l.get(r)!==m&&a(m)});
@@ -0,0 +1 @@
1
+ import{navigateToUrl as o}from"./navigateToUrl";export let navigateToHash=(t="")=>{let{pathname:a,search:e}=location;o(a+(e?"?"+e:"")+(t?"#"+t:""),!0)};
@@ -0,0 +1 @@
1
+ import{buildUrlQueryString as t,getUrlHashPathname as o}from"@koine/utils";export let navigateToHashParams=(a={},e="")=>{let i=!e,r="#/"+o(e=e||location.hash)+("string"==typeof a?a:t(a));return i&&(location.hash=r),r};
@@ -0,0 +1 @@
1
+ import{getUrlHashParams as a,mergeUrlQueryParams as o}from"@koine/utils";import{navigateToHashParams as r}from"./navigateToHashParams";export let navigateToMergedHashParams=(e={},t="")=>r(o(a(t),e),t);
@@ -0,0 +1 @@
1
+ import{getUrlQueryParams as a,mergeUrlQueryParams as o}from"@koine/utils";import{navigateToParams as r}from"./navigateToParams";export let navigateToMergedParams=(e={},t)=>r(o(a(),e),t);
@@ -0,0 +1 @@
1
+ import{buildUrlQueryString as t,isBrowser as o}from"@koine/utils";import{navigateToUrl as r}from"./navigateToUrl";export let navigateToParams=(a={},e)=>{let i="string"==typeof a?a:t(a);return o&&r(location.pathname+i,e),i};
@@ -0,0 +1 @@
1
+ export let navigateToUrl=(t="",e)=>{t&&history[e?"replaceState":"pushState"](history.state,"",t)};
@@ -0,0 +1 @@
1
+ import{getUrlQueryParams as t}from"@koine/utils";import{navigateToParams as r}from"./navigateToParams";export let navigateWithoutUrlParam=(o,a)=>{let e={},i=t();for(let t in i)t!==o&&(e[t]=i[t]);return r(e,a)};
@@ -0,0 +1 @@
1
+ import{buildUrlQueryString as e,isBrowser as o}from"@koine/utils";export let redirectTo=(r,t)=>{if(o){let o=e(t);location.href=r.replace(/\?+$/g,"")+o}};
@@ -0,0 +1 @@
1
+ import{storageClient as t}from"./storageClient";export let storage={l:t(),s:t(!0)};
@@ -0,0 +1 @@
1
+ import{isBrowser as e,isString as o}from"@koine/utils";let t={g:"getItem",s:"setItem",r:"removeItem"};export let storageClient=s=>{let r=(o,r,l)=>e?window[s?"sessionStorage":"localStorage"][t[o]](r,l):()=>{"development"===process.env.NODE_ENV&&console.warn(`[@koine/utils:storageClient]: ${s?"sessionStorage":"localStorage"} does not exists outside of browser.`)};return{get:(o,t,s)=>{let l=s??null;if("development"!==process.env.NODE_ENV||e||console.log(`[@koine/utils:storage] called 'get' outside of browser with default value '${JSON.stringify(s)}'.`),e){let e=r("g",o);if(e){e=t?t(e):e;try{let o=JSON.parse(e);o&&(l=o)}catch(o){l=e}}}return l},set:(t,s,l=e=>e)=>{if("development"!==process.env.NODE_ENV||e||console.log("[@koine/utils:storage] called 'set' outside of browser does not work."),e)try{let e=l(o(s)?s:JSON.stringify(s));r("s",t,e)}catch(e){"development"===process.env.NODE_ENV&&console.warn("[@koine/utils:createStorage]: 'set' error.",e)}},remove:o=>{if("development"!==process.env.NODE_ENV||e||console.log("[@koine/utils:storage] called 'remove' outside of browser does not work."),e)try{r("r",o)}catch(e){"development"===process.env.NODE_ENV&&console.warn("[@koine/utils:createStorage]: 'remove' error.",e)}},has:(o,t)=>{let s=t??!1;return"development"!==process.env.NODE_ENV||e||console.log(`[@koine/utils:storage] called 'has' outside of browser with default value '${JSON.stringify(t)}'.`),e&&(s=r("g",o)??!1),s}}};
@@ -0,0 +1,92 @@
1
+ import { decode, encode, isBrowser, isNullOrUndefined, noop, } from "@koine/utils";
2
+ import { on } from "@koine/dom";
3
+ import { storage } from "./storage";
4
+ export let createStorage = (config, useSessionStorage) => {
5
+ const client = useSessionStorage ? storage.s : storage.l;
6
+ const keys = Object.keys(config).reduce((map, key) => ({ ...map, [key]: encode(key) }), {});
7
+ return {
8
+ get(key, defaultValue) {
9
+ return client.get(keys[key], decode, defaultValue);
10
+ },
11
+ getAll(defaultValues) {
12
+ if (!isBrowser) {
13
+ if (process.env["NODE_ENV"] === "development") {
14
+ console.log(`[@koine/utils:createStorage] attempt to use 'getAll' outside of browser.`);
15
+ }
16
+ return {};
17
+ }
18
+ const all = {};
19
+ for (const key in keys) {
20
+ const value = this.get(key);
21
+ const defaultValue = defaultValues?.[key];
22
+ if (!isNullOrUndefined(value)) {
23
+ all[key] = value;
24
+ }
25
+ else if (defaultValue) {
26
+ all[key] = defaultValue;
27
+ }
28
+ }
29
+ return all;
30
+ },
31
+ set(key, value) {
32
+ client.set(keys[key], value, encode);
33
+ },
34
+ setMany(newValues) {
35
+ if (process.env["NODE_ENV"] === "development") {
36
+ if (!isBrowser) {
37
+ console.log(`[@koine/utils:createStorage] attempt to use 'setMany' outside of browser.`);
38
+ }
39
+ }
40
+ if (isBrowser) {
41
+ for (const key in newValues) {
42
+ const value = newValues[key];
43
+ if (!isNullOrUndefined(value)) {
44
+ this.set(key, value);
45
+ }
46
+ else {
47
+ this.remove(key);
48
+ }
49
+ }
50
+ }
51
+ },
52
+ has(key) {
53
+ return client.has(keys[key]);
54
+ },
55
+ remove(key) {
56
+ client.remove(keys[key]);
57
+ },
58
+ clear() {
59
+ if (process.env["NODE_ENV"] === "development") {
60
+ if (!isBrowser) {
61
+ console.log(`[@koine/utils:createStorage] attempt to use 'clear' outside of browser.`);
62
+ }
63
+ }
64
+ if (isBrowser) {
65
+ for (const key in keys) {
66
+ client.remove(keys[key]);
67
+ }
68
+ }
69
+ },
70
+ watch: (keyToWatch, onRemoved, onAdded) => {
71
+ if (!isBrowser) {
72
+ if (process.env["NODE_ENV"] === "development") {
73
+ console.log(`[@koine/utils:createStorage] attempt to use 'watch' outside of browser.`);
74
+ }
75
+ return noop;
76
+ }
77
+ const handler = (event) => {
78
+ const { key, oldValue, newValue } = event;
79
+ if (key === keys[keyToWatch]) {
80
+ if (oldValue && !newValue) {
81
+ onRemoved?.();
82
+ }
83
+ else if (!oldValue && newValue) {
84
+ onAdded?.();
85
+ }
86
+ }
87
+ };
88
+ const listener = on(window, "storage", handler);
89
+ return listener;
90
+ },
91
+ };
92
+ };
@@ -0,0 +1,21 @@
1
+ import { isBrowser } from "@koine/utils";
2
+ const utcToZonedTime = (date, _tz) => {
3
+ return date;
4
+ };
5
+ export let getZonedDate = (dateString = "", timeZone) => {
6
+ if (!dateString.endsWith("Z"))
7
+ dateString += "Z";
8
+ if (!timeZone && isBrowser) {
9
+ try {
10
+ timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;
11
+ }
12
+ catch (e) {
13
+ if (process.env["NODE_ENV"] === "development") {
14
+ console.warn("[@koine/browser:getZonedDate] failed reading timeZone, error", e);
15
+ }
16
+ }
17
+ }
18
+ return timeZone
19
+ ? utcToZonedTime(new Date(dateString), timeZone)
20
+ : new Date(dateString);
21
+ };
package/gtag.js ADDED
@@ -0,0 +1,7 @@
1
+ import { isUndefined, noop } from "@koine/utils";
2
+ export let gtag = (...args) => {
3
+ !isUndefined(window) && !isUndefined(window.gtag)
4
+ ?
5
+ window.gtag(...args)
6
+ : noop();
7
+ };
@@ -0,0 +1,6 @@
1
+ import { gtag } from "./gtag";
2
+ export let gtagPageview = (...args) => gtag("event", "page_view", {
3
+ page_path: args[0] || location.pathname,
4
+ page_title: args[1] || document.title,
5
+ page_location: args[2] || location.href,
6
+ });
package/index.js ADDED
@@ -0,0 +1,18 @@
1
+ export { createStorage } from "./createStorage";
2
+ export { getZonedDate } from "./getZonedDate";
3
+ export { gtag } from "./gtag";
4
+ export { gtagPageview } from "./gtagPageview";
5
+ export { isIE } from "./isIE";
6
+ export { isMobile } from "./isMobile";
7
+ export { listenUrlSearch } from "./listenUrlSearch";
8
+ export { listenUrlSearchParams } from "./listenUrlSearchParams";
9
+ export { navigateToHash } from "./navigateToHash";
10
+ export { navigateToHashParams } from "./navigateToHashParams";
11
+ export { navigateToMergedHashParams } from "./navigateToMergedHashParams";
12
+ export { navigateToMergedParams } from "./navigateToMergedParams";
13
+ export { navigateToParams } from "./navigateToParams";
14
+ export { navigateToUrl } from "./navigateToUrl";
15
+ export { navigateWithoutUrlParam } from "./navigateWithoutUrlParam";
16
+ export { redirectTo } from "./redirectTo";
17
+ export { storage } from "./storage";
18
+ export { storageClient } from "./storageClient";
package/isIE.js ADDED
@@ -0,0 +1,11 @@
1
+ import { isServer } from "@koine/utils";
2
+ export let isIE = (ssrValue = true) => {
3
+ if (isServer) {
4
+ return ssrValue;
5
+ }
6
+ const ua = window.navigator.userAgent;
7
+ if (ua.indexOf("MSIE ") > 0 || ua.indexOf("Trident/") > 0) {
8
+ return true;
9
+ }
10
+ return false;
11
+ };
package/isMobile.js ADDED
@@ -0,0 +1,5 @@
1
+ import { isServer } from "@koine/utils";
2
+ export let isMobile = (ssrValue = true) => isServer
3
+ ? ssrValue
4
+ :
5
+ /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(window.navigator.userAgent);
@@ -0,0 +1,38 @@
1
+ import { isBrowser } from "@koine/utils";
2
+ import { on } from "@koine/dom";
3
+ let extendHistoryMethod = (fn, runHandlers, before) => {
4
+ return function interceptor(...args) {
5
+ if (before) {
6
+ runHandlers();
7
+ return fn.apply(this, args);
8
+ }
9
+ const result = fn.apply(this, args);
10
+ runHandlers();
11
+ return result;
12
+ };
13
+ };
14
+ let prevSearch = isBrowser ? location.search : "";
15
+ let runHandlers = () => {
16
+ const newSearch = location.search;
17
+ if (newSearch !== prevSearch) {
18
+ const listeners = history.__.h.values();
19
+ for (const listener of listeners) {
20
+ listener(prevSearch, newSearch);
21
+ }
22
+ }
23
+ prevSearch = newSearch;
24
+ };
25
+ export let listenUrlSearch = (handler) => {
26
+ if (!history.__) {
27
+ history.pushState = extendHistoryMethod(history.pushState, runHandlers);
28
+ history.replaceState = extendHistoryMethod(history.replaceState, runHandlers);
29
+ on(window, "popstate", runHandlers);
30
+ history.__ = { h: new Set() };
31
+ }
32
+ if (!history.__.h.has(handler)) {
33
+ history.__.h.add(handler);
34
+ }
35
+ return () => {
36
+ history.__.h.delete(handler);
37
+ };
38
+ };
@@ -0,0 +1,9 @@
1
+ import { listenUrlSearch } from "./listenUrlSearch";
2
+ export let listenUrlSearchParams = (paramName, handler) => listenUrlSearch((prevSearch, newSearch) => {
3
+ const prevParams = new URLSearchParams(prevSearch);
4
+ const newParams = new URLSearchParams(newSearch);
5
+ const newValue = newParams.get(paramName);
6
+ if (prevParams.get(paramName) !== newValue) {
7
+ handler(newValue);
8
+ }
9
+ });
@@ -0,0 +1,5 @@
1
+ import { navigateToUrl } from "./navigateToUrl";
2
+ export let navigateToHash = (hash = "") => {
3
+ const { pathname, search } = location;
4
+ navigateToUrl(pathname + (search ? "?" + search : "") + (hash ? "#" + hash : ""), true);
5
+ };
@@ -0,0 +1,12 @@
1
+ import { buildUrlQueryString, getUrlHashPathname, } from "@koine/utils";
2
+ export let navigateToHashParams = (params = {}, hash = "") => {
3
+ const useLocation = !hash;
4
+ hash = hash || location.hash;
5
+ const hashQueryLess = getUrlHashPathname(hash);
6
+ const queryString = typeof params === "string" ? params : buildUrlQueryString(params);
7
+ const newHash = "#/" + hashQueryLess + queryString;
8
+ if (useLocation) {
9
+ location.hash = newHash;
10
+ }
11
+ return newHash;
12
+ };
@@ -0,0 +1,3 @@
1
+ import { getUrlHashParams, mergeUrlQueryParams, } from "@koine/utils";
2
+ import { navigateToHashParams } from "./navigateToHashParams";
3
+ export let navigateToMergedHashParams = (params = {}, hash = "") => navigateToHashParams(mergeUrlQueryParams(getUrlHashParams(hash), params), hash);
@@ -0,0 +1,3 @@
1
+ import { getUrlQueryParams, mergeUrlQueryParams, } from "@koine/utils";
2
+ import { navigateToParams } from "./navigateToParams";
3
+ export let navigateToMergedParams = (params = {}, replace) => navigateToParams(mergeUrlQueryParams(getUrlQueryParams(), params), replace);
@@ -0,0 +1,9 @@
1
+ import { buildUrlQueryString, isBrowser, } from "@koine/utils";
2
+ import { navigateToUrl } from "./navigateToUrl";
3
+ export let navigateToParams = (params = {}, replace) => {
4
+ const queryString = typeof params === "string" ? params : buildUrlQueryString(params);
5
+ if (isBrowser) {
6
+ navigateToUrl(location.pathname + queryString, replace);
7
+ }
8
+ return queryString;
9
+ };
@@ -0,0 +1,5 @@
1
+ export let navigateToUrl = (url = "", replace) => {
2
+ if (url) {
3
+ history[replace ? "replaceState" : "pushState"](history.state, "", url);
4
+ }
5
+ };
@@ -0,0 +1,12 @@
1
+ import { getUrlQueryParams } from "@koine/utils";
2
+ import { navigateToParams } from "./navigateToParams";
3
+ export let navigateWithoutUrlParam = (paramName, replace) => {
4
+ const params = {};
5
+ const currentParams = getUrlQueryParams();
6
+ for (const key in currentParams) {
7
+ if (key !== paramName) {
8
+ params[key] = currentParams[key];
9
+ }
10
+ }
11
+ return navigateToParams(params, replace);
12
+ };
package/package.json CHANGED
@@ -2,8 +2,8 @@
2
2
  "name": "@koine/browser",
3
3
  "sideEffects": false,
4
4
  "dependencies": {
5
- "@koine/dom": "2.0.0-beta.71",
6
- "@koine/utils": "2.0.0-beta.71"
5
+ "@koine/dom": "2.0.0-beta.73",
6
+ "@koine/utils": "2.0.0-beta.73"
7
7
  },
8
8
  "peerDependenciesMeta": {
9
9
  "date-fns-tz": {
@@ -20,5 +20,5 @@
20
20
  },
21
21
  "module": "./index.esm.js",
22
22
  "main": "./index.cjs.js",
23
- "version": "2.0.0-beta.71"
23
+ "version": "2.0.0-beta.73"
24
24
  }
package/redirectTo.js ADDED
@@ -0,0 +1,7 @@
1
+ import { buildUrlQueryString, isBrowser, } from "@koine/utils";
2
+ export let redirectTo = (url, params) => {
3
+ if (isBrowser) {
4
+ const queryString = buildUrlQueryString(params);
5
+ location.href = url.replace(/\?+$/g, "") + queryString;
6
+ }
7
+ };
package/storage.js ADDED
@@ -0,0 +1,5 @@
1
+ import { storageClient } from "./storageClient";
2
+ export let storage = {
3
+ l: storageClient(),
4
+ s: storageClient(true),
5
+ };
@@ -0,0 +1,90 @@
1
+ import { isBrowser, isString } from "@koine/utils";
2
+ const methodsMap = { g: "getItem", s: "setItem", r: "removeItem" };
3
+ export let storageClient = (useSessionStorage) => {
4
+ const nativeMethod = (method, key, value) => isBrowser
5
+ ? window[useSessionStorage ? "sessionStorage" : "localStorage"][methodsMap[method]](key, value)
6
+ : () => {
7
+ if (process.env["NODE_ENV"] === "development") {
8
+ console.warn(`[@koine/utils:storageClient]: ${useSessionStorage ? "sessionStorage" : "localStorage"} does not exists outside of browser.`);
9
+ }
10
+ };
11
+ const get = (key, transform, defaultValue) => {
12
+ let value = defaultValue ?? null;
13
+ if (process.env["NODE_ENV"] === "development") {
14
+ if (!isBrowser) {
15
+ console.log(`[@koine/utils:storage] called 'get' outside of browser with default value '${JSON.stringify(defaultValue)}'.`);
16
+ }
17
+ }
18
+ if (isBrowser) {
19
+ let stored = nativeMethod("g", key);
20
+ if (stored) {
21
+ stored = transform ? transform(stored) : stored;
22
+ try {
23
+ const parsed = JSON.parse(stored);
24
+ if (parsed)
25
+ value = parsed;
26
+ }
27
+ catch (_e) {
28
+ value = stored;
29
+ }
30
+ }
31
+ }
32
+ return value;
33
+ };
34
+ const set = (key, value, transform = (value) => value) => {
35
+ if (process.env["NODE_ENV"] === "development") {
36
+ if (!isBrowser) {
37
+ console.log(`[@koine/utils:storage] called 'set' outside of browser does not work.`);
38
+ }
39
+ }
40
+ if (isBrowser) {
41
+ try {
42
+ const transformedValue = isString(value)
43
+ ? transform(value)
44
+ : transform(JSON.stringify(value));
45
+ nativeMethod("s", key, transformedValue);
46
+ }
47
+ catch (_e) {
48
+ if (process.env["NODE_ENV"] === "development") {
49
+ console.warn(`[@koine/utils:createStorage]: 'set' error.`, _e);
50
+ }
51
+ }
52
+ }
53
+ };
54
+ const remove = (key) => {
55
+ if (process.env["NODE_ENV"] === "development") {
56
+ if (!isBrowser) {
57
+ console.log(`[@koine/utils:storage] called 'remove' outside of browser does not work.`);
58
+ }
59
+ }
60
+ if (isBrowser) {
61
+ try {
62
+ nativeMethod("r", key);
63
+ }
64
+ catch (_e) {
65
+ if (process.env["NODE_ENV"] === "development") {
66
+ console.warn(`[@koine/utils:createStorage]: 'remove' error.`, _e);
67
+ }
68
+ }
69
+ }
70
+ };
71
+ const has = (key, defaultValue) => {
72
+ let value = defaultValue ?? false;
73
+ if (process.env["NODE_ENV"] === "development") {
74
+ if (!isBrowser) {
75
+ console.log(`[@koine/utils:storage] called 'has' outside of browser with default value '${JSON.stringify(defaultValue)}'.`);
76
+ }
77
+ }
78
+ if (isBrowser) {
79
+ const stored = nativeMethod("g", key);
80
+ value = stored ?? false;
81
+ }
82
+ return value;
83
+ };
84
+ return {
85
+ get,
86
+ set,
87
+ remove,
88
+ has,
89
+ };
90
+ };