state-in-url 6.0.1 → 6.0.3
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/README.md +4 -0
- package/dist/encodeState/encodeState.js +1 -1
- package/dist/encodeState/encodeState.mjs +1 -1
- package/dist/encoder/encoder.js +1 -1
- package/dist/encoder/encoder.mjs +1 -1
- package/dist/next/useUrlState/useUrlState.d.ts +2 -2
- package/dist/next/useUrlState/useUrlState.js +1 -1
- package/dist/next/useUrlState/useUrlState.mjs +1 -1
- package/dist/react-router/useUrlState/useUrlState.d.ts +1 -2
- package/dist/react-router/useUrlState/useUrlState.js +1 -1
- package/dist/react-router/useUrlState/useUrlState.mjs +1 -1
- package/dist/react-router6/useUrlState/useUrlState.d.ts +2 -2
- package/dist/react-router6/useUrlState/useUrlState.js +1 -1
- package/dist/react-router6/useUrlState/useUrlState.mjs +1 -1
- package/dist/remix/useUrlState/useUrlState.d.ts +2 -2
- package/dist/remix/useUrlState/useUrlState.js +1 -1
- package/dist/remix/useUrlState/useUrlState.mjs +1 -1
- package/dist/useInsertionEffect.js +1 -1
- package/dist/useInsertionEffect.mjs +1 -1
- package/dist/useSharedState/useSharedState.js +1 -1
- package/dist/useSharedState/useSharedState.mjs +1 -1
- package/dist/useUrlStateBase/useUrlStateBase.d.ts +1 -33
- package/dist/useUrlStateBase/useUrlStateBase.js +1 -1
- package/dist/useUrlStateBase/useUrlStateBase.mjs +1 -1
- package/dist/utils.d.ts +4 -2
- package/dist/utils.js +1 -1
- package/dist/utils.mjs +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -761,6 +761,10 @@ See [Contributing doc](CONTRIBUTING.md)
|
|
|
761
761
|
|
|
762
762
|
This project is licensed under the [MIT license](LICENSE).
|
|
763
763
|
|
|
764
|
+
## Personal website
|
|
765
|
+
|
|
766
|
+
[Portfolio site](https://asmyshlyaev177.dev)
|
|
767
|
+
|
|
764
768
|
## Inspiration
|
|
765
769
|
|
|
766
770
|
[NUQS](https://github.com/47ng/nuqs)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var a=require("../encoder/encoder.js");var d=require("../utils.js");function f(c,t,r){const n=d.getParams(r);const e=Object.entries(c||{});for(let o=0;o<e.length;o++){const[s,i]=e[o];const u=t?.[s];if(JSON.stringify(i)!==JSON.stringify(u)){n.set(s,a.encode(i))}}return n.toString()}function S(c,t){return{...t||{},...Object.fromEntries([...d.getParams(c).entries()].map(([r,n])=>{const e=t?.[r];return[r,a.decode(n,e)??e]}))}}exports.decodeState=S;exports.encodeState=f;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{decode as
|
|
1
|
+
import{decode as d,encode as a}from"../encoder/encoder.mjs";import{getParams as f}from"../utils.mjs";function g(o,e,r){const n=f(r);const t=Object.entries(o||{});for(let c=0;c<t.length;c++){const[i,s]=t[c];const m=e?.[i];if(JSON.stringify(s)!==JSON.stringify(m)){n.set(i,a(s))}}return n.toString()}function u(o,e){return{...e||{},...Object.fromEntries([...f(o).entries()].map(([r,n])=>{const t=e?.[r];return[r,d(n,t)??t]}))}}export{u as decodeState,g as encodeState};
|
package/dist/encoder/encoder.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var n=require("../constants/constants.js");var
|
|
1
|
+
"use strict";var n=require("../constants/constants.js");var u=require("../utils.js");const s=/'/g;const p=/"/g;const O=/%27/g;function v(e){if(typeof e==="function"||typeof e==="symbol")return"";if(g(e)){return e}return JSON.stringify(structuredClone(e),c).replace(s,"%27").replace(p,"'")}function c(e,r){const i=u.typeOf(r);if(i!=="object"&&i!=="array"){return d(r)}if(i==="object"){const t=r;for(const o of Object.keys(t)){t[o]=c(e,t[o])}return t}if(i==="array"){return r.map(t=>c(e,t))}return r}const d=e=>{switch(u.typeOf(e)){case"date":return n.SYMBOLS.date+new Date(e).toISOString();case"undefined":return n.SYMBOLS.undefined;default:return e}};function y(e,r){return a(e.replace(s,'"').replace(O,"'"),r)}function a(e,r){try{return JSON.parse(e,f)}catch{return r}}function f(e,r){return typeof r==="string"?S(r):r}const S=e=>{if(e===n.SYMBOLS.undefined)return void 0;if(e?.startsWith?.(n.SYMBOLS.date))return new Date(e.slice(1));return e};const l=new RegExp(`^(${n.SYMBOLS.undefined}|${n.SYMBOLS.date})`);const g=e=>l.test(String(e));exports.decode=y;exports.decodePrimitive=S;exports.encode=v;exports.encodePrimitive=d;exports.parseJSON=a;exports.reviver=f;
|
package/dist/encoder/encoder.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{SYMBOLS as n}from"../constants/constants.mjs";import{typeOf as u}from"../utils.mjs";function
|
|
1
|
+
import{SYMBOLS as n}from"../constants/constants.mjs";import{typeOf as u}from"../utils.mjs";const f=/'/g;const y=/"/g;const g=/%27/g;function l(e){if(typeof e==="function"||typeof e==="symbol")return"";if(O(e)){return e}return JSON.stringify(structuredClone(e),i).replace(f,"%27").replace(y,"'")}function i(e,r){const o=u(r);if(o!=="object"&&o!=="array"){return s(r)}if(o==="object"){const t=r;for(const c of Object.keys(t)){t[c]=i(e,t[c])}return t}if(o==="array"){return r.map(t=>i(e,t))}return r}const s=e=>{switch(u(e)){case"date":return n.date+new Date(e).toISOString();case"undefined":return n.undefined;default:return e}};function m(e,r){return a(e.replace(f,'"').replace(g,"'"),r)}function a(e,r){try{return JSON.parse(e,d)}catch{return r}}function d(e,r){return typeof r==="string"?p(r):r}const p=e=>{if(e===n.undefined)return void 0;if(e?.startsWith?.(n.date))return new Date(e.slice(1));return e};const S=new RegExp(`^(${n.undefined}|${n.date})`);const O=e=>S.test(String(e));export{m as decode,p as decodePrimitive,l as encode,s as encodePrimitive,a as parseJSON,d as reviver};
|
|
@@ -80,10 +80,10 @@ export declare function useUrlState<T extends JSONCompatible>(defaultState: T, p
|
|
|
80
80
|
};
|
|
81
81
|
type Router = ReturnType<typeof useRouter>;
|
|
82
82
|
type RouterOptions = NonNullable<Parameters<Router["push"]>[1] | Parameters<Router["replace"]>[1]>;
|
|
83
|
-
interface Options extends RouterOptions {
|
|
83
|
+
export interface Options extends RouterOptions {
|
|
84
84
|
replace?: boolean;
|
|
85
85
|
}
|
|
86
|
-
type Params = {
|
|
86
|
+
export type Params = {
|
|
87
87
|
searchParams?: object;
|
|
88
88
|
replace?: boolean;
|
|
89
89
|
scroll?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var g=require("react");var p=require("next/navigation");var d=require("../../parseSPObj.js");var k=require("../../useUrlStateBase/useUrlStateBase.js");var s=require("../../utils.js");function q(t){return t&&t.__esModule?t:{default:t}}var a=q(g);function M(t,r){const u=a.default.useMemo(()=>r?.useHistory===void 0?true:!!r?.useHistory,[]);const l=p.useRouter();const S=a.default.useMemo(()=>({push:(...e)=>{if(u){s.routerHistory.push(...e)}else{l.push(...e)}},replace:(...e)=>{if(u){s.routerHistory.replace(...e)}else{l.replace(...e)}}}),[l]);const{state:U,updateState:o,updateUrl:n,reset:c,getState:m,pendingUrlUpdate:v}=k.useUrlStateBase(t,S,({parse:e})=>{return s.isSSR?d.parseSPObj(s.filterUnknownParams(t,r?.searchParams),t):e(s.filterUnknownParamsClient(t,r?.searchParams||s.getSearch()))});const i=p.useSearchParams();a.default.useEffect(()=>{if(!v()){o(s.filterUnknownParams(t,d.parseSPObj(Object.fromEntries([...i.entries()]),t)))}},[i]);const f=a.default.useMemo(()=>{const e={..._};if(r?.scroll!==void 0)e.scroll=r.scroll;if(r?.replace!==void 0)e.replace=r.replace;return e},[r?.scroll,r?.replace]);const P=a.default.useCallback((e,b)=>n(e,{...f,...b}),[n]);const h=a.default.useCallback(e=>{c({...f,...e})},[c]);return{setState:o,setUrl:P,urlState:U,reset:h,getState:m}}const _={replace:true,scroll:false};exports.useUrlState=M;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import
|
|
1
|
+
import r from"react";import{useRouter as k,useSearchParams as M}from"next/navigation";import{parseSPObj as p}from"../../parseSPObj.mjs";import{useUrlStateBase as v}from"../../useUrlStateBase/useUrlStateBase.mjs";import{routerHistory as m,filterUnknownParams as f,isSSR as y,filterUnknownParamsClient as C,getSearch as H}from"../../utils.mjs";function j(t,s){const a=r.useMemo(()=>s?.useHistory===void 0?true:!!s?.useHistory,[]);const o=k();const S=r.useMemo(()=>({push:(...e)=>{if(a){m.push(...e)}else{o.push(...e)}},replace:(...e)=>{if(a){m.replace(...e)}else{o.replace(...e)}}}),[o]);const{state:U,updateState:l,updateUrl:c,reset:n,getState:d,pendingUrlUpdate:h}=v(t,S,({parse:e})=>{return y?p(f(t,s?.searchParams),t):e(C(t,s?.searchParams||H()))});const u=M();r.useEffect(()=>{if(!h()){l(f(t,p(Object.fromEntries([...u.entries()]),t)))}},[u]);const i=r.useMemo(()=>{const e={...w};if(s?.scroll!==void 0)e.scroll=s.scroll;if(s?.replace!==void 0)e.replace=s.replace;return e},[s?.scroll,s?.replace]);const P=r.useCallback((e,g)=>c(e,{...i,...g}),[c]);const b=r.useCallback(e=>{n({...i,...e})},[n]);return{setState:l,setUrl:P,urlState:U,reset:b,getState:d}}const w={replace:true,scroll:false};export{j as useUrlState};
|
|
@@ -75,9 +75,8 @@ export declare function useUrlState<T extends JSONCompatible>(defaultState: T, p
|
|
|
75
75
|
[key: string]: unknown;
|
|
76
76
|
}) => void;
|
|
77
77
|
};
|
|
78
|
-
interface Params extends NavigateOptions {
|
|
78
|
+
export interface Params extends NavigateOptions {
|
|
79
79
|
useHistory?: boolean;
|
|
80
80
|
searchParams?: object;
|
|
81
81
|
replace?: boolean;
|
|
82
82
|
}
|
|
83
|
-
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var P=require("react");var o=require("react-router");var _=require("../../parseSPObj.js");var
|
|
1
|
+
"use strict";var P=require("react");var o=require("react-router");var _=require("../../parseSPObj.js");var k=require("../../useUrlStateBase/useUrlStateBase.js");var u=require("../../utils.js");function R(e){return e&&e.__esModule?e:{default:e}}var a=R(P);function h(e,l){const S=l?.useHistory;const s=a.default.useMemo(()=>({...j,replace:l?.replace,preventScrollReset:l?.preventScrollReset}),[]);const n=o.useNavigate();const d=a.default.useMemo(()=>S?u.routerHistory:{replace:(t,r)=>n(t,{...s,...r}),push:(t,r)=>n(t,{...s,...r})},[n]);const[c]=o.useSearchParams();const v=o.useHref("/");const{state:U,updateState:i,updateUrl:f,getState:m,reset:p,pendingUrlUpdate:b}=k.useUrlStateBase(e,d,({parse:t})=>t(u.filterUnknownParamsClient(e,c.entries())),v);const g=a.default.useCallback((t,r)=>f(t,{...s,...r}),[f]);a.default.useEffect(()=>{if(!b()){i(u.assignValue(e,u.filterUnknownParams(e,_.parseSPObj(Object.fromEntries([...c.entries()]),e))))}},[c]);const q=a.default.useCallback(t=>{p({...s,...t})},[p]);return{setState:i,setUrl:g,urlState:U,reset:q,getState:m}}const j={replace:true,preventScrollReset:true};exports.useUrlState=h;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import s from"react";import{useNavigate as
|
|
1
|
+
import s from"react";import{useNavigate as d,useSearchParams as k,useHref as P}from"react-router";import{parseSPObj as h}from"../../parseSPObj.mjs";import{useUrlStateBase as C}from"../../useUrlStateBase/useUrlStateBase.mjs";import{routerHistory as H,filterUnknownParamsClient as R,assignValue as j,filterUnknownParams as w}from"../../utils.mjs";function y(t,o){const i=o?.useHistory;const a=s.useMemo(()=>({...E,replace:o?.replace,preventScrollReset:o?.preventScrollReset}),[]);const n=d();const m=s.useMemo(()=>i?H:{replace:(e,r)=>n(e,{...a,...r}),push:(e,r)=>n(e,{...a,...r})},[n]);const[l]=k();const f=P("/");const{state:S,updateState:c,updateUrl:u,getState:U,reset:p,pendingUrlUpdate:g}=C(t,m,({parse:e})=>e(R(t,l.entries())),f);const b=s.useCallback((e,r)=>u(e,{...a,...r}),[u]);s.useEffect(()=>{if(!g()){c(j(t,w(t,h(Object.fromEntries([...l.entries()]),t))))}},[l]);const v=s.useCallback(e=>{p({...a,...e})},[p]);return{setState:c,setUrl:b,urlState:S,reset:v,getState:U}}const E={replace:true,preventScrollReset:true};export{y as useUrlState};
|
|
@@ -75,9 +75,9 @@ export declare function useUrlState<T extends JSONCompatible>(defaultState: T, p
|
|
|
75
75
|
[key: string]: unknown;
|
|
76
76
|
}) => void;
|
|
77
77
|
};
|
|
78
|
-
|
|
78
|
+
export declare const defaultOpts: NavigateOptions;
|
|
79
|
+
export interface Params extends NavigateOptions {
|
|
79
80
|
useHistory?: boolean;
|
|
80
81
|
searchParams?: object;
|
|
81
82
|
replace?: boolean;
|
|
82
83
|
}
|
|
83
|
-
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var O=require("react");var o=require("react-router-dom");var P=require("../../parseSPObj.js");var _=require("../../useUrlStateBase/useUrlStateBase.js");var l=require("../../utils.js");function k(t){return t&&t.__esModule?t:{default:t}}var a=k(O);function j(t,r){const d=r?.useHistory;const u=a.default.useMemo(()=>{const e={...S};if(r?.replace!==void 0)e.replace=r.replace;if(r?.preventScrollReset!==void 0)e.preventScrollReset=r.preventScrollReset;return e},[r?.replace,r?.preventScrollReset]);const n=o.useNavigate();const v=a.default.useMemo(()=>d?l.routerHistory:{replace:(e,s)=>n(e,{...u,...s}),push:(e,s)=>n(e,{...u,...s})},[n]);const[c]=o.useSearchParams();const U=o.useHref("/");const{state:m,updateState:i,updateUrl:p,getState:R,reset:f,pendingUrlUpdate:b}=_.useUrlStateBase(t,v,({parse:e})=>e(l.filterUnknownParamsClient(t,c.entries())),U);const g=a.default.useCallback((e,s)=>p(e,{...u,...s}),[p]);a.default.useEffect(()=>{if(!b()){i(l.assignValue(t,l.filterUnknownParams(t,P.parseSPObj(Object.fromEntries([...c.entries()]),t))))}},[c]);const q=a.default.useCallback(e=>{f({...u,...e})},[f]);return{setState:i,setUrl:g,urlState:m,reset:q,getState:R}}const S={replace:true,preventScrollReset:true};exports.defaultOpts=S;exports.useUrlState=j;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import
|
|
1
|
+
import o from"react";import{useNavigate as b,useSearchParams as k,useHref as P}from"react-router-dom";import{parseSPObj as C}from"../../parseSPObj.mjs";import{useUrlStateBase as H}from"../../useUrlStateBase/useUrlStateBase.mjs";import{routerHistory as O,filterUnknownParamsClient as h,assignValue as j,filterUnknownParams as w}from"../../utils.mjs";function y(r,t){const f=t?.useHistory;const a=o.useMemo(()=>{const e={...i};if(t?.replace!==void 0)e.replace=t.replace;if(t?.preventScrollReset!==void 0)e.preventScrollReset=t.preventScrollReset;return e},[t?.replace,t?.preventScrollReset]);const n=b();const m=o.useMemo(()=>f?O:{replace:(e,s)=>n(e,{...a,...s}),push:(e,s)=>n(e,{...a,...s})},[n]);const[l]=k();const S=P("/");const{state:v,updateState:c,updateUrl:p,getState:U,reset:u,pendingUrlUpdate:d}=H(r,m,({parse:e})=>e(h(r,l.entries())),S);const R=o.useCallback((e,s)=>p(e,{...a,...s}),[p]);o.useEffect(()=>{if(!d()){c(j(r,w(r,C(Object.fromEntries([...l.entries()]),r))))}},[l]);const g=o.useCallback(e=>{u({...a,...e})},[u]);return{setState:c,setUrl:R,urlState:v,reset:g,getState:U}}const i={replace:true,preventScrollReset:true};export{i as defaultOpts,y as useUrlState};
|
|
@@ -75,9 +75,9 @@ export declare function useUrlState<T extends JSONCompatible>(defaultState: T, p
|
|
|
75
75
|
[key: string]: unknown;
|
|
76
76
|
}) => void;
|
|
77
77
|
};
|
|
78
|
-
|
|
78
|
+
export declare const defaultOpts: NavigateOptions;
|
|
79
|
+
export interface Params extends NavigateOptions {
|
|
79
80
|
useHistory?: boolean;
|
|
80
81
|
searchParams?: object;
|
|
81
82
|
replace?: boolean;
|
|
82
83
|
}
|
|
83
|
-
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var O=require("react");var i=require("@remix-run/react");var P=require("../../parseSPObj.js");var _=require("../../useUrlStateBase/useUrlStateBase.js");var u=require("../../utils.js");function k(e){return e&&e.__esModule?e:{default:e}}var s=k(O);function j(e,r){const d=r?.useHistory;const l=s.default.useMemo(()=>({...n,replace:r?.replace??n.replace,preventScrollReset:r?.preventScrollReset??n.preventScrollReset}),[r?.replace,r?.preventScrollReset]);const c=i.useNavigate();const v=s.default.useMemo(()=>d?u.routerHistory:{replace:(t,a)=>c(t,{...l,...a}),push:(t,a)=>c(t,{...l,...a})},[c]);const[o]=i.useSearchParams();const U=i.useHref("/");const{state:m,updateState:p,updateUrl:f,getState:b,reset:S,pendingUrlUpdate:R}=_.useUrlStateBase(e,v,({parse:t})=>t(u.filterUnknownParamsClient(e,o.entries())),U);const g=s.default.useCallback((t,a)=>f(t,{...l,...a}),[f]);s.default.useEffect(()=>{if(!R()){p(u.assignValue(e,u.filterUnknownParams(e,P.parseSPObj(Object.fromEntries([...o.entries()]),e))))}},[o]);const q=s.default.useCallback(t=>{S({...l,...t})},[S]);return{setState:p,setUrl:g,urlState:m,reset:q,getState:b}}const n={replace:true,preventScrollReset:true};exports.defaultOpts=n;exports.useUrlState=j;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import
|
|
1
|
+
import a from"react";import{useNavigate as g,useSearchParams as k,useHref as P}from"@remix-run/react";import{parseSPObj as C}from"../../parseSPObj.mjs";import{useUrlStateBase as H}from"../../useUrlStateBase/useUrlStateBase.mjs";import{routerHistory as O,filterUnknownParamsClient as h,assignValue as j,filterUnknownParams as w}from"../../utils.mjs";function y(t,r){const m=r?.useHistory;const o=a.useMemo(()=>({...l,replace:r?.replace??l.replace,preventScrollReset:r?.preventScrollReset??l.preventScrollReset}),[r?.replace,r?.preventScrollReset]);const n=g();const f=a.useMemo(()=>m?O:{replace:(e,s)=>n(e,{...o,...s}),push:(e,s)=>n(e,{...o,...s})},[n]);const[c]=k();const S=P("/");const{state:U,updateState:p,updateUrl:u,getState:v,reset:i,pendingUrlUpdate:R}=H(t,f,({parse:e})=>e(h(t,c.entries())),S);const b=a.useCallback((e,s)=>u(e,{...o,...s}),[u]);a.useEffect(()=>{if(!R()){p(j(t,w(t,C(Object.fromEntries([...c.entries()]),t))))}},[c]);const d=a.useCallback(e=>{i({...o,...e})},[i]);return{setState:p,setUrl:b,urlState:U,reset:d,getState:v}}const l={replace:true,preventScrollReset:true};export{l as defaultOpts,y as useUrlState};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var f=require("react");function u(e){return e&&e.__esModule?e:{default:e}}var t=u(f);const s=t.default
|
|
1
|
+
"use strict";var f=require("react");function u(e){return e&&e.__esModule?e:{default:e}}var t=u(f);const s=t.default?.useInsertionEffect||t.default.useEffect;exports.useInsertionEffect=s;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import e from"react";const t=e
|
|
1
|
+
import e from"react";const t=e?.useInsertionEffect||e.useEffect;export{t as useInsertionEffect};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var b=require("react");var
|
|
1
|
+
"use strict";var b=require("react");var r=require("../subscribers.js");var M=require("../useInsertionEffect.js");var i=require("../utils.js");function g(u){return u&&u.__esModule?u:{default:u}}var n=g(b);function v(u,a){const t=n.default.useRef(u);const[f,o]=n.default.useState(()=>{if(i.isSSR){return a?a?.():t.current}const e=r.stateMap.get(t.current);if(!e){const s=a?.()||t.current;r.stateMap.set(t.current,s);return s}else{return e}});const l=n.default.useCallback(e=>{const s=r.stateMap.get(t.current);const S=typeof e==="function";const c=S?e(s,u):{...s,...e};if(i.isEqual(s,c))return void 0;r.stateMap.set(t.current,c);r.subscribers.get(t.current).forEach(p=>p())},[]);M.useInsertionEffect(()=>{const e=()=>{o(r.stateMap.get(t.current)||t.current)};return r.subscribers.add(t.current,e)},[]);const d=n.default.useCallback(()=>r.stateMap.get(t.current)||t.current,[]);return{state:f,getState:d,setState:l}}exports.useSharedState=v;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import c from"react";import{stateMap as n,subscribers as a}from"../subscribers.mjs";import{useInsertionEffect as l}from"../useInsertionEffect.mjs";import{isSSR as b,isEqual as d}from"../utils.mjs";function E(
|
|
1
|
+
import c from"react";import{stateMap as n,subscribers as a}from"../subscribers.mjs";import{useInsertionEffect as l}from"../useInsertionEffect.mjs";import{isSSR as b,isEqual as d}from"../utils.mjs";function E(u,s){const t=c.useRef(u);const[f,i]=c.useState(()=>{if(b){return s?s?.():t.current}const e=n.get(t.current);if(!e){const r=s?.()||t.current;n.set(t.current,r);return r}else{return e}});const m=c.useCallback(e=>{const r=n.get(t.current);const S=typeof e==="function";const o=S?e(r,u):{...r,...e};if(d(r,o))return void 0;n.set(t.current,o);a.get(t.current).forEach(g=>g())},[]);l(()=>{const e=()=>{i(n.get(t.current)||t.current)};return a.add(t.current,e)},[]);const p=c.useCallback(()=>n.get(t.current)||t.current,[]);return{state:f,getState:p,setState:m}}export{E as useSharedState};
|
|
@@ -1,38 +1,5 @@
|
|
|
1
1
|
import { useUrlEncode } from "../useUrlEncode";
|
|
2
2
|
import { type JSONCompatible, type Router } from "../utils";
|
|
3
|
-
/**
|
|
4
|
-
* A custom React hook to create custom hooks.
|
|
5
|
-
*
|
|
6
|
-
* @template T extends JSONCompatible
|
|
7
|
-
* @param {T} defaultState - An object representing the default state values.
|
|
8
|
-
* @param {Router} router - Router object with [push] and [replace] methods.
|
|
9
|
-
* @param {Function} [getInitialState] - Optional function to get the initial state, passes `parse`, and `filterUnknownParams` helpers
|
|
10
|
-
* @returns {Object} [result] State and callbacks
|
|
11
|
-
* @returns {Object} [result.state] - current state object
|
|
12
|
-
* @returns {Function} [result.updateUrl] - function to update state and url
|
|
13
|
-
* @returns {Function} [result.updateState] - function to update state only
|
|
14
|
-
* @returns {Function} [result.reset] - function to reset state and url to default
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
* * Example:
|
|
18
|
-
* ```ts
|
|
19
|
-
* export const form = { name: '' };
|
|
20
|
-
* const router = { push: () => {}, replace: () => {} };
|
|
21
|
-
* const { state, updateState, updateUrl, reset } = useUrlStateBase(form, router, ({ parse, filterClientSP }) =>
|
|
22
|
-
* isSSR() ? getServerState() : getClientState()
|
|
23
|
-
* );
|
|
24
|
-
*
|
|
25
|
-
* updateState({ name: 'John' });
|
|
26
|
-
* updateState((curr, initialState) => ({ ...curr, name: 'John' }));
|
|
27
|
-
* updateUrl({ name: 'John' }, { replace: true });
|
|
28
|
-
* updateUrl(curr => ({ ...curr, name: 'John' }), { replace: true });
|
|
29
|
-
* reset()
|
|
30
|
-
* reset({ replace: true })
|
|
31
|
-
*
|
|
32
|
-
* ```
|
|
33
|
-
*
|
|
34
|
-
* * Docs {@link https://github.com/asmyshlyaev177/state-in-url/tree/integrations/packages/urlstate/useUrlStateBase}
|
|
35
|
-
*/
|
|
36
3
|
export declare function useUrlStateBase<T extends JSONCompatible>(defaultState: T, router: Router, getInitialState?: ({ parse, }: {
|
|
37
4
|
parse: ReturnType<typeof useUrlEncode<T>>["parse"];
|
|
38
5
|
}) => T, basename?: string): {
|
|
@@ -41,6 +8,7 @@ export declare function useUrlStateBase<T extends JSONCompatible>(defaultState:
|
|
|
41
8
|
state: T;
|
|
42
9
|
reset: (options?: Options) => void;
|
|
43
10
|
getState: () => T;
|
|
11
|
+
pendingUrlUpdate: () => boolean;
|
|
44
12
|
};
|
|
45
13
|
interface OptionsObject {
|
|
46
14
|
[key: string]: unknown;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var k=require("react");var _=require("../constants/constants.js");var y=require("../useInsertionEffect.js");var L=require("../useSharedState/useSharedState.js");var P=require("../useUrlEncode/useUrlEncode.js");var c=require("../utils.js");function T(t){return t&&t.__esModule?t:{default:t}}var U=T(k);let i;let n;function b(t,e,l,d){const{parse:s,stringify:o}=P.useUrlEncode(t);const{state:f,getState:u,setState:a}=L.useSharedState(t,()=>l?.({parse:s})||t);y.useInsertionEffect(()=>{const r=()=>{a(s(c.filterUnknownParamsClient(t,c.getSearch())))};window.addEventListener(c.popstateEv,r);return()=>{window.removeEventListener(c.popstateEv,r)}},[]);const p=U.default.useCallback((r,E)=>{const h=typeof r==="function"?r(u(),t):{...u(),...r};const w=o(h,C(t));const v=I(window.location.pathname,d);const S=`${v}${w.length?"?":""}${w}${window.location.hash}`;const $=`${v}${window.location.search}${window.location.hash}`;if(S===$)return;a(h);const{replace:g,...q}=E||{};clearTimeout(i);i=void 0;n={router:e,method:g?"replace":"push",url:S,opts:q};i=setTimeout(()=>{if(n){n.router[n.method](n.url,n.opts);n=void 0}i=void 0},_.TIMEOUT)},[e,o,u]);const m=U.default.useCallback(r=>{a(t);p(t,r)},[p,a]);return{updateState:a,updateUrl:p,state:f,reset:m,getState:u,pendingUrlUpdate:()=>i!==void 0}}function C(t){const e=Object.keys(t);const l=window.location.search;const d=new URLSearchParams(l);const s=new URLSearchParams;for(const[o,f]of d){!e.includes(o)&&s.set(o,f)}return s}function I(t,e){if(!e||e==="/"){return t}return t.slice(e.length)}exports.useUrlStateBase=b;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import
|
|
1
|
+
import S from"react";import{TIMEOUT as y}from"../constants/constants.mjs";import{useInsertionEffect as L}from"../useInsertionEffect.mjs";import{useSharedState as P}from"../useSharedState/useSharedState.mjs";import{useUrlEncode as T}from"../useUrlEncode/useUrlEncode.mjs";import{popstateEv as U,filterUnknownParamsClient as b,getSearch as C}from"../utils.mjs";let i;let n;function R(t,e,l,u){const{parse:r,stringify:s}=T(t);const{state:d,getState:c,setState:a}=P(t,()=>l?.({parse:r})||t);L(()=>{const o=()=>{a(r(b(t,C())))};window.addEventListener(U,o);return()=>{window.removeEventListener(U,o)}},[]);const p=S.useCallback((o,v)=>{const m=typeof o==="function"?o(c(),t):{...c(),...o};const f=s(m,I(t));const w=O(window.location.pathname,u);const h=`${w}${f.length?"?":""}${f}${window.location.hash}`;const g=`${w}${window.location.search}${window.location.hash}`;if(h===g)return;a(m);const{replace:E,...k}=v||{};clearTimeout(i);i=void 0;n={router:e,method:E?"replace":"push",url:h,opts:k};i=setTimeout(()=>{if(n){n.router[n.method](n.url,n.opts);n=void 0}i=void 0},y)},[e,s,c]);const $=S.useCallback(o=>{a(t);p(t,o)},[p,a]);return{updateState:a,updateUrl:p,state:d,reset:$,getState:c,pendingUrlUpdate:()=>i!==void 0}}function I(t){const e=Object.keys(t);const l=window.location.search;const u=new URLSearchParams(l);const r=new URLSearchParams;for(const[s,d]of u){!e.includes(s)&&r.set(s,d)}return r}function O(t,e){if(!e||e==="/"){return t}return t.slice(e.length)}export{R as useUrlStateBase};
|
package/dist/utils.d.ts
CHANGED
|
@@ -11,11 +11,11 @@ export declare const typeOf: (val: unknown) => Type;
|
|
|
11
11
|
export declare const isPrimitive: (val: unknown) => val is Simple;
|
|
12
12
|
export type Simple = string | Date | boolean | number | null | undefined | Function | symbol;
|
|
13
13
|
export declare const isSSR: boolean;
|
|
14
|
-
export type JSON = null | boolean | Date | number | string | {
|
|
14
|
+
export type JSON = null | boolean | Date | number | string | undefined | {
|
|
15
15
|
[prop: string]: JSON | JSON[];
|
|
16
16
|
};
|
|
17
17
|
export type JSONCompatible = {
|
|
18
|
-
[prop: string]: JSON | JSON[];
|
|
18
|
+
[prop: string]: JSON | JSON[] | undefined;
|
|
19
19
|
};
|
|
20
20
|
export declare const getParams: (strOrSearchParams?: string | URLSearchParams) => URLSearchParams;
|
|
21
21
|
export type UnknownObj = object | {
|
|
@@ -32,3 +32,5 @@ export interface Router {
|
|
|
32
32
|
}
|
|
33
33
|
export declare const routerHistory: Router;
|
|
34
34
|
export declare const isSafari: boolean;
|
|
35
|
+
export declare const popstateEv = "popstate";
|
|
36
|
+
export declare function getSearch(): string;
|
package/dist/utils.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";const c=n=>{const t=typeof n;const
|
|
1
|
+
"use strict";const c=n=>{const t=typeof n;const s=n===null;const r=Array.isArray(n);const e=n instanceof Date;const o=!s&&!e&&!r&&t==="object";return s&&"null"||e&&"date"||r&&"array"||o&&"object"||t};const i=typeof window==="undefined";const f=n=>new URLSearchParams(typeof n==="string"?n.split("?")?.[1]||n:n?.toString?.()||"");const u=(n,t)=>JSON.stringify(n)===JSON.stringify(t);function l(n,t){const s=new URLSearchParams;const r=a(n,[...new URLSearchParams(t||"").entries()]);for(const[e,o]of r){s.set(e,o)}return s.toString()}function p(n,t){return Object.fromEntries(a(n,Object.entries(t||{})))}function a(n,t){const s=Object.keys(n);const r=[];for(let e=0;e<t.length;e++){if(s.includes(t[e]?.[0])){r.push([t[e][0].replace(/\+/g," "),t[e][1]])}}return r}function w(n,t){const s=Object.assign({},n);for(const[r]of Object.entries(n)){const e=r;const o=t[e]!==void 0;s[e]=o?t[e]:n[e]}return s}const y={push:n=>{if(typeof window!=="undefined"){window.history.pushState(null,"",n)}},replace:n=>{if(typeof window!=="undefined"){window.history.replaceState(null,"",n)}}};const S=/apple/i.test(!i&&navigator?.userAgent||"");const g="popstate";function d(){return i?"":window.location.search}exports.assignValue=w;exports.filterUnknown=a;exports.filterUnknownParams=p;exports.filterUnknownParamsClient=l;exports.getParams=f;exports.getSearch=d;exports.isEqual=u;exports.isSSR=i;exports.isSafari=S;exports.popstateEv=g;exports.routerHistory=y;exports.typeOf=c;
|
package/dist/utils.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
const a=n=>{const t=typeof n;const
|
|
1
|
+
const a=n=>{const t=typeof n;const o=n===null;const r=Array.isArray(n);const e=n instanceof Date;const s=!o&&!e&&!r&&t==="object";return o&&"null"||e&&"date"||r&&"array"||s&&"object"||t};const i=typeof window==="undefined";const f=n=>new URLSearchParams(typeof n==="string"?n.split("?")?.[1]||n:n?.toString?.()||"");const u=(n,t)=>JSON.stringify(n)===JSON.stringify(t);function l(n,t){const o=new URLSearchParams;const r=c(n,[...new URLSearchParams(t||"").entries()]);for(const[e,s]of r){o.set(e,s)}return o.toString()}function p(n,t){return Object.fromEntries(c(n,Object.entries(t||{})))}function c(n,t){const o=Object.keys(n);const r=[];for(let e=0;e<t.length;e++){if(o.includes(t[e]?.[0])){r.push([t[e][0].replace(/\+/g," "),t[e][1]])}}return r}function w(n,t){const o=Object.assign({},n);for(const[r]of Object.entries(n)){const e=r;const s=t[e]!==void 0;o[e]=s?t[e]:n[e]}return o}const d={push:n=>{if(typeof window!=="undefined"){window.history.pushState(null,"",n)}},replace:n=>{if(typeof window!=="undefined"){window.history.replaceState(null,"",n)}}};const y=/apple/i.test(!i&&navigator?.userAgent||"");const g="popstate";function S(){return i?"":window.location.search}export{w as assignValue,c as filterUnknown,p as filterUnknownParams,l as filterUnknownParamsClient,f as getParams,S as getSearch,u as isEqual,i as isSSR,y as isSafari,g as popstateEv,d as routerHistory,a as typeOf};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "state-in-url",
|
|
3
|
-
"version": "6.0.
|
|
3
|
+
"version": "6.0.3",
|
|
4
4
|
"description": "Store state in URL as in object, types and structure are preserved, with TS validation. Same API as React.useState, wthout any hasssle or boilerplate. Next.js@14-15, react-router@6-7, and remix@2.",
|
|
5
5
|
"homepage": "https://state-in-url.dev",
|
|
6
6
|
"repository": {
|