@koine/browser 2.0.0-beta.72 → 2.0.0-beta.74

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.
Files changed (59) hide show
  1. package/browser/createStorage.js +1 -0
  2. package/browser/getZonedDate.js +1 -0
  3. package/browser/gtag.js +1 -0
  4. package/browser/gtagPageview.js +1 -0
  5. package/browser/index.js +1 -0
  6. package/browser/isIE.js +1 -0
  7. package/browser/isMobile.js +1 -0
  8. package/browser/listenUrlSearch.js +1 -0
  9. package/browser/listenUrlSearchParams.js +1 -0
  10. package/browser/navigateToHash.js +1 -0
  11. package/browser/navigateToHashParams.js +1 -0
  12. package/browser/navigateToMergedHashParams.js +1 -0
  13. package/browser/navigateToMergedParams.js +1 -0
  14. package/browser/navigateToParams.js +1 -0
  15. package/browser/navigateToUrl.js +1 -0
  16. package/browser/navigateWithoutUrlParam.js +1 -0
  17. package/browser/redirectTo.js +1 -0
  18. package/browser/storage.js +1 -0
  19. package/browser/storageClient.js +1 -0
  20. package/createStorage.d.ts +1 -0
  21. package/createStorage.js +93 -0
  22. package/getZonedDate.d.ts +1 -0
  23. package/getZonedDate.js +22 -0
  24. package/gtag.d.ts +1 -0
  25. package/gtag.js +8 -0
  26. package/gtagPageview.d.ts +1 -0
  27. package/gtagPageview.js +7 -0
  28. package/index.cjs.js +12 -12
  29. package/index.esm.js +12 -12
  30. package/index.js +18 -0
  31. package/isIE.d.ts +1 -0
  32. package/isIE.js +12 -0
  33. package/isMobile.d.ts +1 -0
  34. package/isMobile.js +6 -0
  35. package/listenUrlSearch.d.ts +1 -1
  36. package/listenUrlSearch.js +39 -0
  37. package/listenUrlSearchParams.d.ts +1 -0
  38. package/listenUrlSearchParams.js +10 -0
  39. package/navigateToHash.d.ts +1 -0
  40. package/navigateToHash.js +6 -0
  41. package/navigateToHashParams.d.ts +1 -0
  42. package/navigateToHashParams.js +13 -0
  43. package/navigateToMergedHashParams.d.ts +1 -0
  44. package/navigateToMergedHashParams.js +4 -0
  45. package/navigateToMergedParams.d.ts +1 -0
  46. package/navigateToMergedParams.js +4 -0
  47. package/navigateToParams.d.ts +1 -0
  48. package/navigateToParams.js +10 -0
  49. package/navigateToUrl.d.ts +1 -0
  50. package/navigateToUrl.js +6 -0
  51. package/navigateWithoutUrlParam.d.ts +1 -0
  52. package/navigateWithoutUrlParam.js +13 -0
  53. package/package.json +3 -3
  54. package/redirectTo.d.ts +1 -0
  55. package/redirectTo.js +8 -0
  56. package/storage.d.ts +1 -0
  57. package/storage.js +6 -0
  58. package/storageClient.d.ts +1 -0
  59. package/storageClient.js +91 -0
@@ -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}}};
@@ -9,3 +9,4 @@ export declare let createStorage: <T extends CreateStorageConfig>(config: Partia
9
9
  clear(): void;
10
10
  watch: <TKey_4 extends keyof T>(keyToWatch: TKey_4, onRemoved?: () => void, onAdded?: () => void) => () => void | undefined;
11
11
  };
12
+ export default createStorage;
@@ -0,0 +1,93 @@
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
+ };
93
+ export default createStorage;
package/getZonedDate.d.ts CHANGED
@@ -1 +1,2 @@
1
1
  export declare let getZonedDate: (dateString?: string, timeZone?: string) => Date;
2
+ export default getZonedDate;
@@ -0,0 +1,22 @@
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
+ };
22
+ export default getZonedDate;
package/gtag.d.ts CHANGED
@@ -1 +1,2 @@
1
1
  export declare let gtag: <T extends unknown[]>(...args: T) => void;
2
+ export default gtag;
package/gtag.js ADDED
@@ -0,0 +1,8 @@
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
+ };
8
+ export default gtag;
package/gtagPageview.d.ts CHANGED
@@ -4,3 +4,4 @@ export type GtmPageviewArgs = [
4
4
  page_location?: string
5
5
  ];
6
6
  export declare let gtagPageview: (page_path?: string | undefined, page_title?: string | undefined, page_location?: string | undefined) => void;
7
+ export default gtagPageview;
@@ -0,0 +1,7 @@
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
+ });
7
+ export default gtagPageview;
package/index.cjs.js CHANGED
@@ -9,37 +9,37 @@ let t$1={g:"getItem",s:"setItem",r:"removeItem"};let storageClient=s=>{let r=(o,
9
9
 
10
10
  let storage={l:storageClient(),s:storageClient(!0)};
11
11
 
12
- let createStorage=(n,a)=>{let c=a?storage.s:storage.l,m=Object.keys(n).reduce((e,o)=>({...e,[o]:utils.encode(o)}),{});return {get:(t,o)=>c.get(m[t],utils.decode,o),getAll(e){if(!utils.isBrowser)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];utils.isNullOrUndefined(s)?l&&(t[o]=l):t[o]=s;}return t},set(e,o){c.set(m[e],o,utils.encode);},setMany(e){if("development"!==process.env.NODE_ENV||utils.isBrowser||console.log("[@koine/utils:createStorage] attempt to use 'setMany' outside of browser."),utils.isBrowser)for(let t in e){let o=e[t];utils.isNullOrUndefined(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||utils.isBrowser||console.log("[@koine/utils:createStorage] attempt to use 'clear' outside of browser."),utils.isBrowser)for(let e in m)c.remove(m[e]);},watch:(e,t,r)=>utils.isBrowser?dom.on(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."),utils.noop)}};
12
+ let createStorage=(a,n)=>{let c=n?storage.s:storage.l,m=Object.keys(a).reduce((e,o)=>({...e,[o]:utils.encode(o)}),{});return {get:(t,o)=>c.get(m[t],utils.decode,o),getAll(e){if(!utils.isBrowser)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];utils.isNullOrUndefined(s)?l&&(t[o]=l):t[o]=s;}return t},set(e,o){c.set(m[e],o,utils.encode);},setMany(e){if("development"!==process.env.NODE_ENV||utils.isBrowser||console.log("[@koine/utils:createStorage] attempt to use 'setMany' outside of browser."),utils.isBrowser)for(let t in e){let o=e[t];utils.isNullOrUndefined(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||utils.isBrowser||console.log("[@koine/utils:createStorage] attempt to use 'clear' outside of browser."),utils.isBrowser)for(let e in m)c.remove(m[e]);},watch:(e,t,r)=>utils.isBrowser?dom.on(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."),utils.noop)}};
13
13
 
14
14
  let t=(e,t)=>e;let getZonedDate=(o="",n)=>{if(o.endsWith("Z")||(o+="Z"),!n&&utils.isBrowser)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)):new Date(o)};
15
15
 
16
- let gtag=(...g)=>{utils.isUndefined(window)||utils.isUndefined(window.gtag)?utils.noop():window.gtag(...g);};
16
+ let gtag=(...o)=>{utils.isUndefined(window)||utils.isUndefined(window.gtag)?utils.noop():window.gtag(...o);};
17
17
 
18
18
  let gtagPageview=(...t)=>gtag("event","page_view",{page_path:t[0]||location.pathname,page_title:t[1]||document.title,page_location:t[2]||location.href});
19
19
 
20
- let isIE=(i=!0)=>{if(utils.isServer)return i;let r=window.navigator.userAgent;return !!(r.indexOf("MSIE ")>0||r.indexOf("Trident/")>0)};
20
+ let isIE=(t=!0)=>{if(utils.isServer)return t;let i=window.navigator.userAgent;return !!(i.indexOf("MSIE ")>0||i.indexOf("Trident/")>0)};
21
21
 
22
22
  let isMobile=(e=!0)=>utils.isServer?e:/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(window.navigator.userAgent);
23
23
 
24
- 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=utils.isBrowser?location.search:"",i=()=>{let t=location.search;if(t!==r)for(let e of history.__.h.values())e(r,t);r=t;};let listenUrlSearch=t=>(history.__||(history.pushState=o(history.pushState,i),history.replaceState=o(history.replaceState,i),dom.on(window,"popstate",i),history.__={h:new Set}),history.__.h.has(t)||history.__.h.add(t),()=>{history.__.h.delete(t);});
24
+ let r=(t,e,r)=>function(...o){if(r)return e(),t.apply(this,o);let i=t.apply(this,o);return e(),i},o=utils.isBrowser?location.search:"",i=()=>{let t=location.search;if(t!==o)for(let e of history.__.h.values())e(o,t);o=t;};let listenUrlSearch=t=>(history.__||(history.pushState=r(history.pushState,i),history.replaceState=r(history.replaceState,i),dom.on(window,"popstate",i),history.__={h:new Set}),history.__.h.has(t)||history.__.h.add(t),()=>{history.__.h.delete(t);});
25
25
 
26
- let listenUrlSearchParams=(r,a)=>listenUrlSearch((e,t)=>{let l=new URLSearchParams(e),m=new URLSearchParams(t).get(r);l.get(r)!==m&&a(m);});
26
+ let listenUrlSearchParams=(r,a)=>listenUrlSearch((e,t)=>{let l=new URLSearchParams(e),s=new URLSearchParams(t).get(r);l.get(r)!==s&&a(s);});
27
27
 
28
28
  let navigateToUrl=(t="",e)=>{t&&history[e?"replaceState":"pushState"](history.state,"",t);};
29
29
 
30
- let navigateToHash=(t="")=>{let{pathname:a,search:e}=location;navigateToUrl(a+(e?"?"+e:"")+(t?"#"+t:""),!0);};
30
+ let navigateToHash=(t="")=>{let{pathname:o,search:e}=location;navigateToUrl(o+(e?"?"+e:"")+(t?"#"+t:""),!0);};
31
31
 
32
- let navigateToHashParams=(a={},e="")=>{let i=!e,r="#/"+utils.getUrlHashPathname(e=e||location.hash)+("string"==typeof a?a:utils.buildUrlQueryString(a));return i&&(location.hash=r),r};
32
+ let navigateToHashParams=(o={},e="")=>{let r=!e,i="#/"+utils.getUrlHashPathname(e=e||location.hash)+("string"==typeof o?o:utils.buildUrlQueryString(o));return r&&(location.hash=i),i};
33
33
 
34
- let navigateToMergedHashParams=(e={},t="")=>navigateToHashParams(utils.mergeUrlQueryParams(utils.getUrlHashParams(t),e),t);
34
+ let navigateToMergedHashParams=(o={},t="")=>navigateToHashParams(utils.mergeUrlQueryParams(utils.getUrlHashParams(t),o),t);
35
35
 
36
- let navigateToParams=(a={},e)=>{let i="string"==typeof a?a:utils.buildUrlQueryString(a);return utils.isBrowser&&navigateToUrl(location.pathname+i,e),i};
36
+ let navigateToParams=(e={},r)=>{let i="string"==typeof e?e:utils.buildUrlQueryString(e);return utils.isBrowser&&navigateToUrl(location.pathname+i,r),i};
37
37
 
38
- let navigateToMergedParams=(e={},t)=>navigateToParams(utils.mergeUrlQueryParams(utils.getUrlQueryParams(),e),t);
38
+ let navigateToMergedParams=(o={},t)=>navigateToParams(utils.mergeUrlQueryParams(utils.getUrlQueryParams(),o),t);
39
39
 
40
- let navigateWithoutUrlParam=(o,a)=>{let e={},i=utils.getUrlQueryParams();for(let t in i)t!==o&&(e[t]=i[t]);return navigateToParams(e,a)};
40
+ let navigateWithoutUrlParam=(a,e)=>{let o={},i=utils.getUrlQueryParams();for(let t in i)t!==a&&(o[t]=i[t]);return navigateToParams(o,e)};
41
41
 
42
- let redirectTo=(r,t)=>{if(utils.isBrowser){let o=utils.buildUrlQueryString(t);location.href=r.replace(/\?+$/g,"")+o;}};
42
+ let redirectTo=(t,o)=>{if(utils.isBrowser){let r=utils.buildUrlQueryString(o);location.href=t.replace(/\?+$/g,"")+r;}};
43
43
 
44
44
  exports.createStorage = createStorage;
45
45
  exports.getZonedDate = getZonedDate;
package/index.esm.js CHANGED
@@ -5,36 +5,36 @@ let t$1={g:"getItem",s:"setItem",r:"removeItem"};let storageClient=s=>{let r=(o,
5
5
 
6
6
  let storage={l:storageClient(),s:storageClient(!0)};
7
7
 
8
- let createStorage=(n,a)=>{let c=a?storage.s:storage.l,m=Object.keys(n).reduce((e,o)=>({...e,[o]:encode(o)}),{});return {get:(t,o)=>c.get(m[t],decode,o),getAll(e){if(!isBrowser)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];isNullOrUndefined(s)?l&&(t[o]=l):t[o]=s;}return t},set(e,o){c.set(m[e],o,encode);},setMany(e){if("development"!==process.env.NODE_ENV||isBrowser||console.log("[@koine/utils:createStorage] attempt to use 'setMany' outside of browser."),isBrowser)for(let t in e){let o=e[t];isNullOrUndefined(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||isBrowser||console.log("[@koine/utils:createStorage] attempt to use 'clear' outside of browser."),isBrowser)for(let e in m)c.remove(m[e]);},watch:(e,t,r)=>isBrowser?on(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."),noop)}};
8
+ let createStorage=(a,n)=>{let c=n?storage.s:storage.l,m=Object.keys(a).reduce((e,o)=>({...e,[o]:encode(o)}),{});return {get:(t,o)=>c.get(m[t],decode,o),getAll(e){if(!isBrowser)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];isNullOrUndefined(s)?l&&(t[o]=l):t[o]=s;}return t},set(e,o){c.set(m[e],o,encode);},setMany(e){if("development"!==process.env.NODE_ENV||isBrowser||console.log("[@koine/utils:createStorage] attempt to use 'setMany' outside of browser."),isBrowser)for(let t in e){let o=e[t];isNullOrUndefined(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||isBrowser||console.log("[@koine/utils:createStorage] attempt to use 'clear' outside of browser."),isBrowser)for(let e in m)c.remove(m[e]);},watch:(e,t,r)=>isBrowser?on(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."),noop)}};
9
9
 
10
10
  let t=(e,t)=>e;let getZonedDate=(o="",n)=>{if(o.endsWith("Z")||(o+="Z"),!n&&isBrowser)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)):new Date(o)};
11
11
 
12
- let gtag=(...g)=>{isUndefined(window)||isUndefined(window.gtag)?noop():window.gtag(...g);};
12
+ let gtag=(...o)=>{isUndefined(window)||isUndefined(window.gtag)?noop():window.gtag(...o);};
13
13
 
14
14
  let gtagPageview=(...t)=>gtag("event","page_view",{page_path:t[0]||location.pathname,page_title:t[1]||document.title,page_location:t[2]||location.href});
15
15
 
16
- let isIE=(i=!0)=>{if(isServer)return i;let r=window.navigator.userAgent;return !!(r.indexOf("MSIE ")>0||r.indexOf("Trident/")>0)};
16
+ let isIE=(t=!0)=>{if(isServer)return t;let i=window.navigator.userAgent;return !!(i.indexOf("MSIE ")>0||i.indexOf("Trident/")>0)};
17
17
 
18
18
  let isMobile=(e=!0)=>isServer?e:/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(window.navigator.userAgent);
19
19
 
20
- 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=isBrowser?location.search:"",i=()=>{let t=location.search;if(t!==r)for(let e of history.__.h.values())e(r,t);r=t;};let listenUrlSearch=t=>(history.__||(history.pushState=o(history.pushState,i),history.replaceState=o(history.replaceState,i),on(window,"popstate",i),history.__={h:new Set}),history.__.h.has(t)||history.__.h.add(t),()=>{history.__.h.delete(t);});
20
+ let r=(t,e,r)=>function(...o){if(r)return e(),t.apply(this,o);let i=t.apply(this,o);return e(),i},o=isBrowser?location.search:"",i=()=>{let t=location.search;if(t!==o)for(let e of history.__.h.values())e(o,t);o=t;};let listenUrlSearch=t=>(history.__||(history.pushState=r(history.pushState,i),history.replaceState=r(history.replaceState,i),on(window,"popstate",i),history.__={h:new Set}),history.__.h.has(t)||history.__.h.add(t),()=>{history.__.h.delete(t);});
21
21
 
22
- let listenUrlSearchParams=(r,a)=>listenUrlSearch((e,t)=>{let l=new URLSearchParams(e),m=new URLSearchParams(t).get(r);l.get(r)!==m&&a(m);});
22
+ let listenUrlSearchParams=(r,a)=>listenUrlSearch((e,t)=>{let l=new URLSearchParams(e),s=new URLSearchParams(t).get(r);l.get(r)!==s&&a(s);});
23
23
 
24
24
  let navigateToUrl=(t="",e)=>{t&&history[e?"replaceState":"pushState"](history.state,"",t);};
25
25
 
26
- let navigateToHash=(t="")=>{let{pathname:a,search:e}=location;navigateToUrl(a+(e?"?"+e:"")+(t?"#"+t:""),!0);};
26
+ let navigateToHash=(t="")=>{let{pathname:o,search:e}=location;navigateToUrl(o+(e?"?"+e:"")+(t?"#"+t:""),!0);};
27
27
 
28
- let navigateToHashParams=(a={},e="")=>{let i=!e,r="#/"+getUrlHashPathname(e=e||location.hash)+("string"==typeof a?a:buildUrlQueryString(a));return i&&(location.hash=r),r};
28
+ let navigateToHashParams=(o={},e="")=>{let r=!e,i="#/"+getUrlHashPathname(e=e||location.hash)+("string"==typeof o?o:buildUrlQueryString(o));return r&&(location.hash=i),i};
29
29
 
30
- let navigateToMergedHashParams=(e={},t="")=>navigateToHashParams(mergeUrlQueryParams(getUrlHashParams(t),e),t);
30
+ let navigateToMergedHashParams=(o={},t="")=>navigateToHashParams(mergeUrlQueryParams(getUrlHashParams(t),o),t);
31
31
 
32
- let navigateToParams=(a={},e)=>{let i="string"==typeof a?a:buildUrlQueryString(a);return isBrowser&&navigateToUrl(location.pathname+i,e),i};
32
+ let navigateToParams=(e={},r)=>{let i="string"==typeof e?e:buildUrlQueryString(e);return isBrowser&&navigateToUrl(location.pathname+i,r),i};
33
33
 
34
- let navigateToMergedParams=(e={},t)=>navigateToParams(mergeUrlQueryParams(getUrlQueryParams(),e),t);
34
+ let navigateToMergedParams=(o={},t)=>navigateToParams(mergeUrlQueryParams(getUrlQueryParams(),o),t);
35
35
 
36
- let navigateWithoutUrlParam=(o,a)=>{let e={},i=getUrlQueryParams();for(let t in i)t!==o&&(e[t]=i[t]);return navigateToParams(e,a)};
36
+ let navigateWithoutUrlParam=(a,e)=>{let o={},i=getUrlQueryParams();for(let t in i)t!==a&&(o[t]=i[t]);return navigateToParams(o,e)};
37
37
 
38
- let redirectTo=(r,t)=>{if(isBrowser){let o=buildUrlQueryString(t);location.href=r.replace(/\?+$/g,"")+o;}};
38
+ let redirectTo=(t,o)=>{if(isBrowser){let r=buildUrlQueryString(o);location.href=t.replace(/\?+$/g,"")+r;}};
39
39
 
40
40
  export { createStorage, getZonedDate, gtag, gtagPageview, isIE, isMobile, listenUrlSearch, listenUrlSearchParams, navigateToHash, navigateToHashParams, navigateToMergedHashParams, navigateToMergedParams, navigateToParams, navigateToUrl, navigateWithoutUrlParam, redirectTo, storage, storageClient };
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.d.ts CHANGED
@@ -1 +1,2 @@
1
1
  export declare let isIE: (ssrValue?: boolean) => boolean;
2
+ export default isIE;
package/isIE.js ADDED
@@ -0,0 +1,12 @@
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
+ };
12
+ export default isIE;
package/isMobile.d.ts CHANGED
@@ -1 +1,2 @@
1
1
  export declare let isMobile: (ssrValue?: boolean) => boolean;
2
+ export default isMobile;
package/isMobile.js ADDED
@@ -0,0 +1,6 @@
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);
6
+ export default isMobile;
@@ -1,3 +1,3 @@
1
1
  type Handler = (prevLocationSearch: string, newLocationSearch: string) => void;
2
2
  export declare let listenUrlSearch: (handler: Handler) => () => void;
3
- export {};
3
+ export default listenUrlSearch;
@@ -0,0 +1,39 @@
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
+ };
39
+ export default listenUrlSearch;
@@ -1 +1,2 @@
1
1
  export declare let listenUrlSearchParams: (paramName: string, handler: (paramNewValue: string | null) => void) => () => void;
2
+ export default listenUrlSearchParams;
@@ -0,0 +1,10 @@
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
+ });
10
+ export default listenUrlSearchParams;
@@ -1 +1,2 @@
1
1
  export declare let navigateToHash: (hash?: string) => void;
2
+ export default navigateToHash;
@@ -0,0 +1,6 @@
1
+ import { navigateToUrl } from "./navigateToUrl";
2
+ export let navigateToHash = (hash = "") => {
3
+ const { pathname, search } = location;
4
+ navigateToUrl(pathname + (search ? "?" + search : "") + (hash ? "#" + hash : ""), true);
5
+ };
6
+ export default navigateToHash;
@@ -1,2 +1,3 @@
1
1
  import { type AnyQueryParams } from "@koine/utils";
2
2
  export declare let navigateToHashParams: (params?: string | AnyQueryParams, hash?: string) => string;
3
+ export default navigateToHashParams;
@@ -0,0 +1,13 @@
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
+ };
13
+ export default navigateToHashParams;
@@ -1,2 +1,3 @@
1
1
  import { type AnyQueryParams } from "@koine/utils";
2
2
  export declare let navigateToMergedHashParams: (params?: NonNullable<AnyQueryParams>, hash?: string) => string;
3
+ export default navigateToMergedHashParams;
@@ -0,0 +1,4 @@
1
+ import { getUrlHashParams, mergeUrlQueryParams, } from "@koine/utils";
2
+ import { navigateToHashParams } from "./navigateToHashParams";
3
+ export let navigateToMergedHashParams = (params = {}, hash = "") => navigateToHashParams(mergeUrlQueryParams(getUrlHashParams(hash), params), hash);
4
+ export default navigateToMergedHashParams;
@@ -1,2 +1,3 @@
1
1
  import { type AnyQueryParams } from "@koine/utils";
2
2
  export declare let navigateToMergedParams: (params?: NonNullable<AnyQueryParams>, replace?: boolean) => string;
3
+ export default navigateToMergedParams;
@@ -0,0 +1,4 @@
1
+ import { getUrlQueryParams, mergeUrlQueryParams, } from "@koine/utils";
2
+ import { navigateToParams } from "./navigateToParams";
3
+ export let navigateToMergedParams = (params = {}, replace) => navigateToParams(mergeUrlQueryParams(getUrlQueryParams(), params), replace);
4
+ export default navigateToMergedParams;
@@ -1,2 +1,3 @@
1
1
  import { type AnyQueryParams } from "@koine/utils";
2
2
  export declare let navigateToParams: (params?: string | AnyQueryParams, replace?: boolean) => string;
3
+ export default navigateToParams;
@@ -0,0 +1,10 @@
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
+ };
10
+ export default navigateToParams;
@@ -1 +1,2 @@
1
1
  export declare let navigateToUrl: (url?: string, replace?: boolean) => void;
2
+ export default navigateToUrl;
@@ -0,0 +1,6 @@
1
+ export let navigateToUrl = (url = "", replace) => {
2
+ if (url) {
3
+ history[replace ? "replaceState" : "pushState"](history.state, "", url);
4
+ }
5
+ };
6
+ export default navigateToUrl;
@@ -1 +1,2 @@
1
1
  export declare let navigateWithoutUrlParam: (paramName?: string, replace?: boolean) => string;
2
+ export default navigateWithoutUrlParam;
@@ -0,0 +1,13 @@
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
+ };
13
+ export default navigateWithoutUrlParam;
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.72",
6
- "@koine/utils": "2.0.0-beta.72"
5
+ "@koine/dom": "2.0.0-beta.74",
6
+ "@koine/utils": "2.0.0-beta.74"
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.72"
23
+ "version": "2.0.0-beta.74"
24
24
  }
package/redirectTo.d.ts CHANGED
@@ -1,2 +1,3 @@
1
1
  import { type AnyQueryParams } from "@koine/utils";
2
2
  export declare let redirectTo: (url: string, params?: AnyQueryParams) => void;
3
+ export default redirectTo;
package/redirectTo.js ADDED
@@ -0,0 +1,8 @@
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
+ };
8
+ export default redirectTo;
package/storage.d.ts CHANGED
@@ -12,3 +12,4 @@ export declare let storage: {
12
12
  has: <TKey_3 extends string, TValue_2 = any>(key: TKey_3, defaultValue?: TValue_2 | undefined) => boolean | NonNullable<TValue_2>;
13
13
  };
14
14
  };
15
+ export default storage;
package/storage.js ADDED
@@ -0,0 +1,6 @@
1
+ import { storageClient } from "./storageClient";
2
+ export let storage = {
3
+ l: storageClient(),
4
+ s: storageClient(true),
5
+ };
6
+ export default storage;
@@ -5,3 +5,4 @@ export declare let storageClient: <TConfig extends StorageClientConfig = Storage
5
5
  remove: <TKey_2 extends Extract<keyof TConfig, string>>(key: TKey_2) => void;
6
6
  has: <TKey_3 extends Extract<keyof TConfig, string>, TValue_2 = TConfig[TKey_3]>(key: TKey_3, defaultValue?: TValue_2 | undefined) => boolean | NonNullable<TValue_2>;
7
7
  };
8
+ export default storageClient;
@@ -0,0 +1,91 @@
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
+ };
91
+ export default storageClient;