state-in-url 8.0.0 → 8.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/constants/constants.cjs +1 -1
- package/dist/constants/constants.mjs +1 -1
- package/dist/package.json +1 -1
- package/dist/react/useUrlState/useUrlState.cjs +1 -1
- package/dist/react-router/useUrlState/useUrlState.cjs +1 -1
- package/dist/react-router/useUrlState/useUrlState.d.ts +1 -1
- package/dist/react-router/useUrlState/useUrlState.mjs +1 -1
- package/dist/react-router6/useUrlState/useUrlState.cjs +1 -1
- package/dist/react-router6/useUrlState/useUrlState.d.ts +1 -1
- package/dist/react-router6/useUrlState/useUrlState.mjs +1 -1
- package/dist/remix/useUrlState/useUrlState.cjs +1 -1
- package/dist/remix/useUrlState/useUrlState.d.ts +1 -1
- package/dist/remix/useUrlState/useUrlState.mjs +1 -1
- package/dist/useIsomorphicLayoutEffect.cjs +1 -1
- package/dist/useIsomorphicLayoutEffect.mjs +1 -1
- package/dist/useLinkProps/useLinkProps.mjs +1 -1
- package/dist/useUrlEncode/useUrlEncode.cjs +1 -1
- package/dist/useUrlStateBase/useUrlStateBase.cjs +1 -1
- package/dist/useUrlStateBase/useUrlStateBase.mjs +1 -1
- package/dist/utils.cjs +1 -1
- package/dist/utils.d.ts +2 -1
- package/dist/utils.mjs +1 -1
- package/package.json +1 -1
- package/skills/astro-setup/SKILL.md +1 -1
- package/skills/feature-state-hook/SKILL.md +1 -1
- package/skills/form-library-integration/SKILL.md +1 -1
- package/skills/input-handling/SKILL.md +1 -1
- package/skills/nextjs-ssr/SKILL.md +1 -1
- package/skills/react-no-router/SKILL.md +1 -1
- package/skills/react-router-remix-setup/SKILL.md +1 -1
- package/skills/shared-state-no-url/SKILL.md +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var e=require("../utils.cjs");const i={date:"\u23F2",undefined:"\u2219undefined"};const
|
|
1
|
+
"use strict";var e=require("../utils.cjs");const i={date:"\u23F2",undefined:"\u2219undefined"};const t=e.isWebKit?330:70;exports.SYMBOLS=i;exports.TIMEOUT=t;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{isWebKit as e}from"../utils.mjs";const n={date:"\u23F2",undefined:"\u2219undefined"};const t=e?330:70;export{n as SYMBOLS,t as TIMEOUT};
|
package/dist/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "state-in-url",
|
|
3
|
-
"version": "8.0.
|
|
3
|
+
"version": "8.0.1",
|
|
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-16, react-router@6-7, remix@2, and Astro.",
|
|
5
5
|
"homepage": "https://state-in-url.dev",
|
|
6
6
|
"repository": {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var P=require("react");var
|
|
1
|
+
"use strict";var P=require("react");var o=require("../../parseSPObj.cjs");var m=require("../../useUrlStateBase/useUrlStateBase.cjs");var t=require("../../utils.cjs");function g(e){return e&&e.__esModule?e:{default:e}}var a=g(P);function k(e,s){const{state:f,updateState:n,updateUrl:c,reset:i,getState:S,pendingUrlUpdate:p}=m.useUrlStateBase(e,t.routerHistory,({parse:r})=>t.isSSR?o.parseSPObj(t.filterUnknownParams(e,s?.searchParams),e):r(t.filterUnknownParamsClient(e,s?.searchParams||t.getSearch())));const l=a.default.useCallback(()=>{if(p())return;n(t.filterUnknownParams(e,o.parseSPObj(Object.fromEntries(t.getParams(t.getSearch()).entries()),e)))},[]);a.default.useEffect(()=>{l();return t.subscribeToUrl(l)},[l]);const u=a.default.useMemo(()=>({replace:s?.replace??true}),[s?.replace]);const U=a.default.useCallback((r,b)=>c(r,{...u,...b}),[c,u]);const d=a.default.useCallback(r=>{i({...u,...r})},[i,u]);return{setState:n,setUrl:U,urlState:f,reset:d,getState:S}}exports.useUrlState=k;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var P=require("react");var o=require("react-router");var _=require("../../parseSPObj.cjs");var k=require("../../useUrlStateBase/useUrlStateBase.cjs");var u=require("../../utils.cjs");function
|
|
1
|
+
"use strict";var P=require("react");var o=require("react-router");var _=require("../../parseSPObj.cjs");var k=require("../../useUrlStateBase/useUrlStateBase.cjs");var u=require("../../utils.cjs");function j(e){return e&&e.__esModule?e:{default:e}}var s=j(P);function C(e,r){const v=r?.useHistory;const l=s.default.useMemo(()=>({...i,replace:r?.replace??i.replace,preventScrollReset:r?.preventScrollReset??i.preventScrollReset}),[r?.replace,r?.preventScrollReset]);const n=o.useNavigate();const d=s.default.useMemo(()=>v?u.routerHistory:{replace:(t,a)=>n(t,{...l,...a,replace:true}),push:(t,a)=>n(t,{...l,...a,replace:false})},[n]);const[c]=o.useSearchParams();const U=o.useHref("/");const{state:m,updateState:p,updateUrl:f,getState:R,reset:S,pendingUrlUpdate:b}=k.useUrlStateBase(e,d,({parse:t})=>t(u.filterUnknownParamsClient(e,c.entries())),U);const g=s.default.useCallback((t,a)=>f(t,{...l,...a}),[f]);s.default.useEffect(()=>{if(!b()){p(u.assignValue(e,u.filterUnknownParams(e,_.parseSPObj(Object.fromEntries([...c.entries()]),e))))}},[c]);const q=s.default.useCallback(t=>{S({...l,...t})},[S]);return{setState:p,setUrl:g,urlState:m,reset:q,getState:R}}const i={replace:true,preventScrollReset:true};exports.useUrlState=C;
|
|
@@ -5,7 +5,7 @@ import { type JSONCompatible } from '../../utils';
|
|
|
5
5
|
*
|
|
6
6
|
* @param {JSONCompatible<T>} [defaultState] Fallback (default) values for state
|
|
7
7
|
* @param {Object} params - Object with other parameters
|
|
8
|
-
* @param {NavigateOptions} params.NavigateOptions See type from [`react-router-dom`](https://api.reactrouter.com/v7/interfaces/
|
|
8
|
+
* @param {NavigateOptions} params.NavigateOptions See type from [`react-router-dom`](https://api.reactrouter.com/v7/interfaces/react-router.NavigateOptions.html)
|
|
9
9
|
* @param {boolean} params.replace replace URL or push, default `true`
|
|
10
10
|
* @param {boolean} params.useHistory use window.history for navigation, default `false`
|
|
11
11
|
* @param {boolean} params.preventScrollReset keep scroll position, default `true`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import
|
|
1
|
+
import a from"react";import{useNavigate as d,useSearchParams as k,useHref as P}from"react-router";import{parseSPObj as C}from"../../parseSPObj.mjs";import{useUrlStateBase as H}from"../../useUrlStateBase/useUrlStateBase.mjs";import{routerHistory as h,filterUnknownParamsClient as j,assignValue as w,filterUnknownParams as y}from"../../utils.mjs";function E(t,r){const m=r?.useHistory;const o=a.useMemo(()=>({...c,replace:r?.replace??c.replace,preventScrollReset:r?.preventScrollReset??c.preventScrollReset}),[r?.replace,r?.preventScrollReset]);const l=d();const f=a.useMemo(()=>m?h:{replace:(e,s)=>l(e,{...o,...s,replace:true}),push:(e,s)=>l(e,{...o,...s,replace:false})},[l]);const[n]=k();const S=P("/");const{state:U,updateState:p,updateUrl:u,getState:v,reset:i,pendingUrlUpdate:g}=H(t,f,({parse:e})=>e(j(t,n.entries())),S);const R=a.useCallback((e,s)=>u(e,{...o,...s}),[u]);a.useEffect(()=>{if(!g()){p(w(t,y(t,C(Object.fromEntries([...n.entries()]),t))))}},[n]);const b=a.useCallback(e=>{i({...o,...e})},[i]);return{setState:p,setUrl:R,urlState:U,reset:b,getState:v}}const c={replace:true,preventScrollReset:true};export{E as useUrlState};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var O=require("react");var o=require("react-router-dom");var P=require("../../parseSPObj.cjs");var _=require("../../useUrlStateBase/useUrlStateBase.cjs");var
|
|
1
|
+
"use strict";var O=require("react");var o=require("react-router-dom");var P=require("../../parseSPObj.cjs");var _=require("../../useUrlStateBase/useUrlStateBase.cjs");var u=require("../../utils.cjs");function k(t){return t&&t.__esModule?t:{default:t}}var s=k(O);function j(t,r){const d=r?.useHistory;const l=s.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=s.default.useMemo(()=>d?u.routerHistory:{replace:(e,a)=>n(e,{...l,...a,replace:true}),push:(e,a)=>n(e,{...l,...a,replace:false})},[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(u.filterUnknownParamsClient(t,c.entries())),U);const g=s.default.useCallback((e,a)=>p(e,{...l,...a}),[p]);s.default.useEffect(()=>{if(!b()){i(u.assignValue(t,u.filterUnknownParams(t,P.parseSPObj(Object.fromEntries([...c.entries()]),t))))}},[c]);const q=s.default.useCallback(e=>{f({...l,...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;
|
|
@@ -5,7 +5,7 @@ import { type JSONCompatible } from '../../utils';
|
|
|
5
5
|
*
|
|
6
6
|
* @param {JSONCompatible<T>} [defaultState] Fallback (default) values for state
|
|
7
7
|
* @param {Object} params - Object with other parameters
|
|
8
|
-
* @param {NavigateOptions} params.NavigateOptions See type from [`react-router-dom`](https://api.reactrouter.com/v7/interfaces/
|
|
8
|
+
* @param {NavigateOptions} params.NavigateOptions See type from [`react-router-dom`](https://api.reactrouter.com/v7/interfaces/react-router.NavigateOptions.html)
|
|
9
9
|
* @param {boolean} params.replace replace URL or push, default `true`
|
|
10
10
|
* @param {boolean} params.useHistory use window.history for navigation, default `false`
|
|
11
11
|
* @param {boolean} params.preventScrollReset keep scroll position, default `true`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import
|
|
1
|
+
import a 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 o=a.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 l=b();const m=a.useMemo(()=>f?O:{replace:(e,s)=>l(e,{...o,...s,replace:true}),push:(e,s)=>l(e,{...o,...s,replace:false})},[l]);const[n]=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,n.entries())),S);const R=a.useCallback((e,s)=>p(e,{...o,...s}),[p]);a.useEffect(()=>{if(!d()){c(j(r,w(r,C(Object.fromEntries([...n.entries()]),r))))}},[n]);const g=a.useCallback(e=>{u({...o,...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};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var O=require("react");var
|
|
1
|
+
"use strict";var O=require("react");var p=require("@remix-run/react");var P=require("../../parseSPObj.cjs");var _=require("../../useUrlStateBase/useUrlStateBase.cjs");var u=require("../../utils.cjs");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=p.useNavigate();const v=s.default.useMemo(()=>d?u.routerHistory:{replace:(t,a)=>c(t,{...l,...a,replace:true}),push:(t,a)=>c(t,{...l,...a,replace:false})},[c]);const[o]=p.useSearchParams();const U=p.useHref("/");const{state:m,updateState:i,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()){i(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:i,setUrl:g,urlState:m,reset:q,getState:b}}const n={replace:true,preventScrollReset:true};exports.defaultOpts=n;exports.useUrlState=j;
|
|
@@ -5,7 +5,7 @@ import { type JSONCompatible } from '../../utils';
|
|
|
5
5
|
*
|
|
6
6
|
* @param {JSONCompatible<T>} [defaultState] Fallback (default) values for state
|
|
7
7
|
* @param {Object} params - Object with other parameters
|
|
8
|
-
* @param {NavigateOptions} params.NavigateOptions See type from [`react-router-dom`](https://api.reactrouter.com/v7/interfaces/
|
|
8
|
+
* @param {NavigateOptions} params.NavigateOptions See type from [`react-router-dom`](https://api.reactrouter.com/v7/interfaces/react-router.NavigateOptions.html)
|
|
9
9
|
* @param {boolean} params.replace replace URL or push, default `true`
|
|
10
10
|
* @param {boolean} params.useHistory use window.history for navigation, default `false`
|
|
11
11
|
* @param {boolean} params.preventScrollReset keep scroll position, default `true`
|
|
@@ -1 +1 @@
|
|
|
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
|
+
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,replace:true}),push:(e,s)=>n(e,{...o,...s,replace:false})},[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 u=require("react");function f(
|
|
1
|
+
"use strict";var u=require("react");function f(e){return e&&e.__esModule?e:{default:e}}var t=f(u);const o=typeof window==="undefined"?t.default.useEffect:t.default.useLayoutEffect;exports.useIsomorphicLayoutEffect=o;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import
|
|
1
|
+
import o from"react";const e=typeof window==="undefined"?o.useEffect:o.useLayoutEffect;export{e as useIsomorphicLayoutEffect};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import
|
|
1
|
+
import n from"react";import{decodeState as a}from"../encodeState/encodeState.mjs";import{stateMap as i}from"../subscribers.mjs";import{filterUnknownParamsClient as f}from"../utils.mjs";import{hrefWithState as c}from"./hrefWithState.mjs";const m=/^[a-z][a-z\d+\-.]*:|^\/\//i;function u(e){return e.defaultPrevented||e.button!==0||e.metaKey||e.ctrlKey||e.shiftKey||e.altKey||!!e.currentTarget?.target}function l(e){return i.get(e)??a(f(e,window.location.search),e)}function s(e,r){return n.useCallback(t=>({href:t,onClick:o=>{if(m.test(t)||u(o))return;o.preventDefault();r(c(t,e,l(e),window.location.search))}}),[e,r])}export{s as useLinkProps};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var c=require("react");var u=require("../encodeState/encodeState.cjs");function l(e){return e&&e.__esModule?e:{default:e}}var a=l(c);function d(e){const n=a.default.useCallback((t,o)=>{return u.encodeState(t,e,o)},[e]);const r=a.default.useCallback(t=>u.decodeState(t,e),[e]);return{parse:r,stringify:n}}exports.useUrlEncode=d;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var M=require("react");var O=require("../constants/constants.cjs");var P=require("../useIsomorphicLayoutEffect.cjs");var R=require("../useSharedState/useSharedState.cjs");var j=require("../useUrlEncode/useUrlEncode.cjs");var n=require("../utils.cjs");function D(t){return t&&t.__esModule?t:{default:t}}var l=D(M);let f;let s;let a;let v;let m=0;const S=()=>window.location.pathname+window.location.search;function d(){a=void 0;v?.();v=void 0}function g(){if(!a)return void 0;const t=S();if(t===a.from&&t!==a.to){return a}d();return void 0}function H(t,e){const o=g()?.from??S();if(o===t){d();return}a={from:o,to:t,search:e};v??=n.subscribeToUrl(d)}function V(t){if(t.pathname!==window.location.pathname)return;const e=g();const o=t.pathname+t.search;if(e?.to===o)return;const c=o===S();if(c&&!e)return;const i=c?"replace":t.method;t.router[i](t.url,t.opts);H(o,t.search)}function W(t,e,o,c){const{parse:i,stringify:E}=j.useUrlEncode(t);const{state:L,getState:u,setState:h}=R.useSharedState(t,()=>o?.({parse:i})||t);const p=l.default.useRef();if(p.current===void 0)p.current=n.getSearch();P.useIsomorphicLayoutEffect(()=>{const r=()=>{h(i(n.filterUnknownParamsClient(t,n.getSearch())))};window.addEventListener(n.popstateEv,r);if(p.current!==n.getSearch())r();return()=>{window.removeEventListener(n.popstateEv,r)}},[]);l.default.useEffect(()=>{m+=1;return()=>{m-=1;if(m===0)d()}},[]);const w=l.default.useCallback((r,y)=>{const U=typeof r==="function"?r(u(),t):{...u(),...r};h(U);const $=s?.search??g()?.search??window.location.search;const q=E(U,n.getOtherParams(t,$));const T=q.length?`?${q}`:"";const _=x(window.location.pathname,c);const b=`${_}${T}${window.location.hash}`;if(b===`${_}${$}${window.location.hash}`)return;const{replace:C,...I}=y||{};clearTimeout(f);s={router:e,method:C?"replace":"push",url:b,pathname:window.location.pathname,search:T,opts:I};f=setTimeout(()=>{f=void 0;if(!s)return;const B=s;s=void 0;V(B)},O.TIMEOUT)},[e,E,u]);const k=l.default.useCallback(r=>w(t,r),[w]);return{updateState:h,updateUrl:w,state:L,reset:k,getState:u,pendingUrlUpdate:()=>f!==void 0}}function x(t,e){if(!e||e==="/"){return t}return t.slice(e.length)}exports.useUrlStateBase=W;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import u from"react";import{TIMEOUT as
|
|
1
|
+
import u from"react";import{TIMEOUT as x}from"../constants/constants.mjs";import{useIsomorphicLayoutEffect as B}from"../useIsomorphicLayoutEffect.mjs";import{useSharedState as H}from"../useSharedState/useSharedState.mjs";import{useUrlEncode as M}from"../useUrlEncode/useUrlEncode.mjs";import{getSearch as h,popstateEv as L,filterUnknownParamsClient as V,getOtherParams as W,subscribeToUrl as _}from"../utils.mjs";let f;let a;let n;let w;let v=0;const g=()=>window.location.pathname+window.location.search;function l(){n=void 0;w?.();w=void 0}function S(){if(!n)return void 0;const t=g();if(t===n.from&&t!==n.to){return n}l();return void 0}function q(t,o){const r=S()?.from??g();if(r===t){l();return}n={from:r,to:t,search:o};w??=_(l)}function z(t){if(t.pathname!==window.location.pathname)return;const o=S();const r=t.pathname+t.search;if(o?.to===r)return;const i=r===g();if(i&&!o)return;const s=i?"replace":t.method;t.router[s](t.url,t.opts);q(r,t.search)}function A(t,o,r,i){const{parse:s,stringify:U}=M(t);const{state:y,getState:c,setState:m}=H(t,()=>r?.({parse:s})||t);const p=u.useRef();if(p.current===void 0)p.current=h();B(()=>{const e=()=>{m(s(V(t,h())))};window.addEventListener(L,e);if(p.current!==h())e();return()=>{window.removeEventListener(L,e)}},[]);u.useEffect(()=>{v+=1;return()=>{v-=1;if(v===0)l()}},[]);const d=u.useCallback((e,O)=>{const $=typeof e==="function"?e(c(),t):{...c(),...e};m($);const E=a?.search??S()?.search??window.location.search;const T=U($,W(t,E));const b=T.length?`?${T}`:"";const k=D(window.location.pathname,i);const C=`${k}${b}${window.location.hash}`;if(C===`${k}${E}${window.location.hash}`)return;const{replace:P,...R}=O||{};clearTimeout(f);a={router:o,method:P?"replace":"push",url:C,pathname:window.location.pathname,search:b,opts:R};f=setTimeout(()=>{f=void 0;if(!a)return;const j=a;a=void 0;z(j)},x)},[o,U,c]);const I=u.useCallback(e=>d(t,e),[d]);return{updateState:m,updateUrl:d,state:y,reset:I,getState:c,pendingUrlUpdate:()=>f!==void 0}}function D(t,o){if(!o||o==="/"){return t}return t.slice(o.length)}export{A as useUrlStateBase};
|
package/dist/utils.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";const a=n=>{if(n===null)return"null";const t=typeof n;if(t!=="object")return t;if(Array.isArray(n))return"array";if(n instanceof Date)return"date";return"object"};const w=n=>{const t=a(n);return t!=="object"&&t!=="array"};const i=typeof window==="undefined";const
|
|
1
|
+
"use strict";const a=n=>{if(n===null)return"null";const t=typeof n;if(t!=="object")return t;if(Array.isArray(n))return"array";if(n instanceof Date)return"date";return"object"};const w=n=>{const t=a(n);return t!=="object"&&t!=="array"};const i=typeof window==="undefined";const y=n=>{if(n instanceof URLSearchParams){return n}if(typeof n==="string"){const t=n.indexOf("?");return new URLSearchParams(t===-1?n:n.slice(t+1))}return new URLSearchParams};const p=(n,t)=>{if(n.length!==t.length)return false;return n.every((e,s)=>c(e,t[s]))};const g=(n,t)=>{const e=Object.keys(n);const s=Object.keys(t);if(e.length!==s.length)return false;return e.every(r=>c(n[r],t[r]))};const c=(n,t)=>{if(n===t)return true;if(n==null||t==null)return false;const e=a(n);const s=a(t);if(e!==s)return false;if(w(n))return false;if(e==="array"){return p(n,t)}if(e==="object"){return g(n,t)}return JSON.stringify(n)===JSON.stringify(t)};function S(n,t){const e=new URLSearchParams;const s=f(n,[...new URLSearchParams(t||"").entries()]);for(const[r,o]of s){e.set(r,o)}return e.toString()}function b(n,t){const e=Object.keys(n);const s=new URLSearchParams;for(const[r,o]of new URLSearchParams(t)){if(!e.includes(r))s.set(r,o)}return s}function m(n,t){const e=t instanceof URLSearchParams?[...t.entries()]:Object.entries(t||{});return Object.fromEntries(f(n,e))}function f(n,t){const e=Object.keys(n);const s=[];for(let r=0;r<t.length;r++){if(e.includes(t[r]?.[0])){s.push([t[r][0].replace(/\+/g," "),t[r][1]])}}return s}function P(n,t){const e=Object.assign({},n);for(const[s]of Object.entries(n)){const r=s;const o=t[r]!==void 0;e[r]=o?t[r]:n[r]}return e}const U={push:n=>{if(typeof window!=="undefined"){window.history.pushState(null,"",n)}},replace:n=>{if(typeof window!=="undefined"){window.history.replaceState(null,"",n)}}};const d=n=>/AppleWebKit\/[6-9]\d\d/.test(n);const O=d(!i&&navigator?.userAgent||"");const u="popstate";function j(){return i?"":window.location.search}const l=new Set;let h=false;function v(){if(h||i)return;h=true;for(const n of["pushState","replaceState"]){const t=window.history[n];window.history[n]=function e(...s){const r=t.apply(this,s);queueMicrotask(()=>{for(const o of[...l])o()});return r}}}function k(n){if(i)return()=>void 0;v();l.add(n);window.addEventListener(u,n);return()=>{l.delete(n);window.removeEventListener(u,n)}}exports.assignValue=P;exports.filterUnknown=f;exports.filterUnknownParams=m;exports.filterUnknownParamsClient=S;exports.getOtherParams=b;exports.getParams=y;exports.getSearch=j;exports.isEqual=c;exports.isPrimitive=w;exports.isSSR=i;exports.isWebKit=O;exports.isWebKitUserAgent=d;exports.popstateEv=u;exports.routerHistory=U;exports.subscribeToUrl=k;exports.typeOf=a;
|
package/dist/utils.d.ts
CHANGED
|
@@ -33,7 +33,8 @@ export interface Router {
|
|
|
33
33
|
replace: (href: string, opts?: object) => void;
|
|
34
34
|
}
|
|
35
35
|
export declare const routerHistory: Router;
|
|
36
|
-
export declare const
|
|
36
|
+
export declare const isWebKitUserAgent: (userAgent: string) => boolean;
|
|
37
|
+
export declare const isWebKit: boolean;
|
|
37
38
|
export declare const popstateEv = "popstate";
|
|
38
39
|
export declare function getSearch(): string;
|
|
39
40
|
type UrlCb = () => void;
|
package/dist/utils.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
const c=n=>{if(n===null)return"null";const t=typeof n;if(t!=="object")return t;if(Array.isArray(n))return"array";if(n instanceof Date)return"date";return"object"};const w=n=>{const t=c(n);return t!=="object"&&t!=="array"};const i=typeof window==="undefined";const
|
|
1
|
+
const c=n=>{if(n===null)return"null";const t=typeof n;if(t!=="object")return t;if(Array.isArray(n))return"array";if(n instanceof Date)return"date";return"object"};const w=n=>{const t=c(n);return t!=="object"&&t!=="array"};const i=typeof window==="undefined";const y=n=>{if(n instanceof URLSearchParams){return n}if(typeof n==="string"){const t=n.indexOf("?");return new URLSearchParams(t===-1?n:n.slice(t+1))}return new URLSearchParams};const p=(n,t)=>{if(n.length!==t.length)return false;return n.every((e,s)=>a(e,t[s]))};const S=(n,t)=>{const e=Object.keys(n);const s=Object.keys(t);if(e.length!==s.length)return false;return e.every(r=>a(n[r],t[r]))};const a=(n,t)=>{if(n===t)return true;if(n==null||t==null)return false;const e=c(n);const s=c(t);if(e!==s)return false;if(w(n))return false;if(e==="array"){return p(n,t)}if(e==="object"){return S(n,t)}return JSON.stringify(n)===JSON.stringify(t)};function g(n,t){const e=new URLSearchParams;const s=f(n,[...new URLSearchParams(t||"").entries()]);for(const[r,o]of s){e.set(r,o)}return e.toString()}function b(n,t){const e=Object.keys(n);const s=new URLSearchParams;for(const[r,o]of new URLSearchParams(t)){if(!e.includes(r))s.set(r,o)}return s}function m(n,t){const e=t instanceof URLSearchParams?[...t.entries()]:Object.entries(t||{});return Object.fromEntries(f(n,e))}function f(n,t){const e=Object.keys(n);const s=[];for(let r=0;r<t.length;r++){if(e.includes(t[r]?.[0])){s.push([t[r][0].replace(/\+/g," "),t[r][1]])}}return s}function O(n,t){const e=Object.assign({},n);for(const[s]of Object.entries(n)){const r=s;const o=t[r]!==void 0;e[r]=o?t[r]:n[r]}return e}const P={push:n=>{if(typeof window!=="undefined"){window.history.pushState(null,"",n)}},replace:n=>{if(typeof window!=="undefined"){window.history.replaceState(null,"",n)}}};const d=n=>/AppleWebKit\/[6-9]\d\d/.test(n);const U=d(!i&&navigator?.userAgent||"");const u="popstate";function j(){return i?"":window.location.search}const l=new Set;let h=false;function v(){if(h||i)return;h=true;for(const n of["pushState","replaceState"]){const t=window.history[n];window.history[n]=function e(...s){const r=t.apply(this,s);queueMicrotask(()=>{for(const o of[...l])o()});return r}}}function L(n){if(i)return()=>void 0;v();l.add(n);window.addEventListener(u,n);return()=>{l.delete(n);window.removeEventListener(u,n)}}export{O as assignValue,f as filterUnknown,m as filterUnknownParams,g as filterUnknownParamsClient,b as getOtherParams,y as getParams,j as getSearch,a as isEqual,w as isPrimitive,i as isSSR,U as isWebKit,d as isWebKitUserAgent,u as popstateEv,P as routerHistory,L as subscribeToUrl,c as typeOf};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "state-in-url",
|
|
3
|
-
"version": "8.0.
|
|
3
|
+
"version": "8.0.1",
|
|
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-16, react-router@6-7, remix@2, and Astro.",
|
|
5
5
|
"homepage": "https://state-in-url.dev",
|
|
6
6
|
"repository": {
|