react-magic-search-params 2.2.2 → 2.3.0

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 CHANGED
@@ -9,6 +9,8 @@
9
9
 
10
10
  Type-safe query/search parameter management for React Router, built as an extension over useSearchParams.
11
11
 
12
+ Define one params contract per screen (`mandatory` + `optional`) so URL state stays predictable and strongly typed.
13
+
12
14
  ## Installation
13
15
 
14
16
  ```bash
@@ -66,6 +68,12 @@ const { getParams } = useMagicSearchParams({
66
68
  const { only_unmapped } = getParams({ convert: true });
67
69
  ```
68
70
 
71
+ For optional boolean unions with `''` as default, coercion keeps `''` for absent/empty/invalid URL values and returns booleans only for valid `true`/`false` inputs.
72
+
73
+ For arrays, prefer real array defaults in your contract (`tags: []`). In that contract shape, `coerceParams: 'array'` works for query-array formats (`csv`, `repeat`, `brackets`). Use codecs only when a key is modeled as a string that carries JSON-like array text (for example `"[]"`).
74
+
75
+ If your menu/sidebar links should always open with mandatory URL state, prebuild links with mandatory params and keep `defaultParams` in the page hook. Use `forceParams` only for non-user-controllable keys (for example `page_size`), not necessarily all mandatory keys.
76
+
69
77
  ## API
70
78
 
71
79
  - `getParams({ convert?: boolean })`
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";var V=Object.defineProperty;var me=Object.getOwnPropertyDescriptor;var ue=Object.getOwnPropertyNames;var Pe=Object.prototype.hasOwnProperty;var le=(u,d)=>{for(var f in d)V(u,f,{get:d[f],enumerable:!0})},pe=(u,d,f,l)=>{if(d&&typeof d=="object"||typeof d=="function")for(let y of ue(d))!Pe.call(u,y)&&y!==f&&V(u,y,{get:()=>d[y],enumerable:!(l=me(d,y))||l.enumerable});return u};var fe=u=>pe(V({},"__esModule",{value:!0}),u);var ge={};le(ge,{useMagicSearchParams:()=>Y});module.exports=fe(ge);var Q=require("react-router-dom"),P=require("react"),Y=({mandatory:u={},optional:d={},defaultParams:f={},arraySerialization:l="csv",forceParams:y={},omitParamsByValues:q=[],coerceParams:G={},codecs:F={},historyMode:E="push",resetOnChange:J={},paginationStrategy:w,unknownParamsPolicy:A="drop"})=>{let[i,L]=(0,Q.useSearchParams)(),C=(0,P.useRef)({}),j=(0,P.useRef)({}),I=(0,P.useCallback)((e,r)=>{L(e,{replace:(r??E)==="replace"})},[L,E]),p=(0,P.useMemo)(()=>({...u,...d}),[u,d]),X=(0,P.useMemo)(()=>Array.from(Object.keys(p)),[p]),v=(0,P.useCallback)(e=>Object.prototype.hasOwnProperty.call(p,e),[p]),Z=e=>!Array.isArray(p[e])||l==="csv"?i.get(e):l==="repeat"?i.getAll(e):i.getAll(`${e}[]`),B=(0,P.useCallback)(()=>{if(A==="drop")return[];let e=[];for(let[r,s]of i.entries()){let a=r.endsWith("[]")?r.replace("[]",""):r;v(a)||e.push([r,s])}return e},[A,i,v]),H=(0,P.useCallback)(e=>{if(A==="drop")return e;let r=new URLSearchParams(e.toString()),s=B();for(let[a,t]of s)r.append(a,t);return r},[A,B]),_=(e,r)=>Array.isArray(e)&&Array.isArray(r)?e.length!==r.length?!1:e.every((s,a)=>s===r[a]):e===r,T=(0,P.useMemo)(()=>Object.keys(p).filter(e=>Array.isArray(p[e])),[p]),z=(e,r)=>{let s={...e};return T.length===0||T.forEach(a=>{let t=[];switch(l){case"csv":{t=(i.get(a)||"").split(",").map(o=>o.trim()).filter(Boolean);break}case"repeat":{let n=i.getAll(a);t=n.length>0?n:[];break}case"brackets":{let n=i.getAll(`${a}[]`);t=n.length>0?n:[];break}default:t=(i.get(a)??"").split(",").map(o=>o.trim()).filter(Boolean)}if(r[a]!==void 0){let n=r[a],o=[];typeof n=="string"?o=t.includes(n)?t.filter(m=>m!==n):[...t,n]:Array.isArray(n)?o=Array.from(new Set([...n.map(String)])):o=t,s[a]=o}}),s},K=e=>{let r=new URLSearchParams,s=Object.keys(e);for(let a of s){let t=F[a];if(t?.serialize){let n=t.serialize(e[a],{key:a});if(n==null)continue;if(Array.isArray(n))if(Array.isArray(p[a]))if(l==="csv")r.set(a,n.join(","));else if(l==="repeat")for(let o of n)r.append(a,String(o));else for(let o of n)r.append(`${a}[]`,String(o));else n.length>0&&r.set(a,String(n[0]));else r.set(a,String(n));continue}if(Array.isArray(p[a])){let n=e[a];switch(l){case"csv":{r.set(a,n.join(","));break}case"repeat":{for(let o of n)r.append(a,String(o));break}case"brackets":{for(let o of n)r.append(`${a}[]`,String(o));break}default:r.set(a,n.join(","))}}else r.set(a,String(e[a]))}return r},O=(e,r)=>Object.prototype.hasOwnProperty.call(u,e)?u[e]:Object.prototype.hasOwnProperty.call(f,e)?f[e]:r,W=({paramsForced:e,compareParams:r})=>Object.entries(e).every(([a,t])=>r[a]===t),x=e=>{let r=Z(e),s=F[e];if(s?.parse)return s.parse(r,{key:e,searchParams:i});let a=G[e];if(a==="number"){let t=Number.parseInt(String(r??""),10);if(Number.isNaN(t)){let n=O(e,0);return typeof n=="number"?n:0}return t}if(a==="boolean")return String(r)==="true";if(a==="array")return l==="csv"?String(r??"").split(",").filter(Boolean):Array.isArray(r)?r:r?[r]:[];if(a==="string")return Array.isArray(r)?r[0]??"":r??"";if(typeof p[e]=="number"){let t=Number.parseInt(String(r??""),10);if(Number.isNaN(t)){let n=O(e,0);return typeof n=="number"?n:0}return t}return typeof p[e]=="boolean"?String(r)==="true":Array.isArray(p[e])?l==="csv"?String(r??"").split(",").filter(Boolean):Array.isArray(r)?r:r?[r]:[]:Array.isArray(r)?r[0]??"":r??""},$=(e,r)=>{if(Array.isArray(p[e])){if(l==="brackets"){let t=i.getAll(`${e}[]`),n=K({[e]:t}).toString();return decodeURIComponent(n)}if(l==="csv"){let t=i.getAll(e),n=K({[e]:t}).toString();return decodeURIComponent(n)}let a=i.getAll(e);return K({[e]:a}).toString()}return r[e]},ee=e=>{let r={};for(let[s,a]of e.entries())if(s.endsWith("[]")){let t=s.replace("[]","");r[t]?r[t].push(a):r[t]=[a]}else r[s]?Array.isArray(r[s])?r[s].push(a):r[s]=[r[s],a]:r[s]=a;return r},N=(0,P.useMemo)(()=>l==="brackets"?ee(i):Object.fromEntries(i.entries()),[i,l]),M=({convert:e=!0}={})=>Object.keys(N).reduce((s,a)=>{if(Object.prototype.hasOwnProperty.call(p,a)){let t=l==="brackets"?a.replace("[]",""):a;s[t]=e===!0?x(t):$(a,N)}return s},{}),b=(e,r)=>{let s=String(e);return r?.convert!==!1?x(s):$(s,N)},re=e=>e==null||typeof e!="object"?!1:Object.prototype.hasOwnProperty.call(e,"newParams")||Object.prototype.hasOwnProperty.call(e,"keepParams")||Object.prototype.hasOwnProperty.call(e,"historyMode"),ae=e=>{let r=M({convert:!0});if(typeof e=="function"){let s=e(r);return re(s)?{newParams:typeof s.newParams=="function"?s.newParams(r):s.newParams??{},keepParams:s.keepParams??{},historyMode:s.historyMode}:{newParams:s,keepParams:{},historyMode:void 0}}return e?{newParams:typeof e.newParams=="function"?e.newParams(r):e.newParams??{},keepParams:e.keepParams??{},historyMode:e.historyMode}:{newParams:{},keepParams:{},historyMode:void 0}},se=({currentParams:e,newParams:r,keepParams:s})=>{let a={...r},t={...s};for(let[n,o]of Object.entries(J))if(!(!o||o.length===0||!Object.prototype.hasOwnProperty.call(a,n)||_(a[n],e[n]))){for(let c of o)if(!Object.prototype.hasOwnProperty.call(y,c)){if(Object.prototype.hasOwnProperty.call(u,c)){a[c]=u[c],delete t[c];continue}if(Object.prototype.hasOwnProperty.call(f,c)){a[c]=f[c],delete t[c];continue}delete a[c],t[c]=!1}}return{newParams:a,keepParams:t}},te=(e,r)=>{let s=M(),a=Object.entries(e).filter(([o])=>!Array.isArray(p[o])),t=Object.assign({...s,...Object.fromEntries(a)},y),n=Object.keys(t).reduce((o,m)=>{if(Object.prototype.hasOwnProperty.call(r,m)&&r[m]===!1)return o;let c=t[m],h=typeof c=="string"&&q.includes(c);return c!=null&&c!==""&&!h&&(o[m]=c),o},{});return{...u,...n}},ne=e=>X.reduce((s,a)=>(Object.prototype.hasOwnProperty.call(e,a)&&(s[a]=e[a]),s),{}),oe=()=>{let e=T.length>0,r=M({convert:e});return Object.keys(r).reduce((a,t)=>(Object.prototype.hasOwnProperty.call(u,t)&&(a[t]=r[t]),a),{})},D=({keepMandatoryParams:e=!0,historyMode:r}={})=>{let s=K({...u,...e&&{...oe()},...y}),a=H(s);I(a,r)},g=e=>{let r=ae(e),s=M({convert:!0}),a=se({currentParams:s,newParams:r.newParams,keepParams:r.keepParams}),t=a.newParams,n=a.keepParams;if(Object.keys(t).length===0&&Object.keys(n).length===0){D({historyMode:r.historyMode});return}let o=te(t,n),m=z(o,t),c=ne(m),h=K(c),U=H(h);I(U,r.historyMode)},k=w?.mode==="page"?w:void 0,R=w?.mode==="offset"?w:void 0,S=w?.mode==="cursor"?w:void 0,ce={mode:w?.mode??"page",next:e=>{let r=w?.mode??"page";if(r==="cursor"){let n=S?.cursorKey??"cursor";typeof e=="string"&&g({newParams:{[n]:e}});return}if(r==="offset"){let n=R?.offsetKey??"offset",o=R?.limitKey??"limit",m=Number(b(n,{convert:!0})??0),c=Number(b(o,{convert:!0})??O(String(o),10)),h=Number.isFinite(m)?m:0,U=Number.isFinite(c)&&c>0?c:10;g({newParams:{[n]:h+U}});return}let s=k?k.pageKey??"page":"page",a=Number(b(s,{convert:!0})??O(String(s),1)),t=Number.isFinite(a)&&a>0?a:1;g({newParams:{[s]:t+1}})},prev:()=>{let e=w?.mode??"page";if(e==="cursor"){let t=S?.cursorKey??"cursor";g({keepParams:{[t]:!1}});return}if(e==="offset"){let t=R?.offsetKey??"offset",n=R?.limitKey??"limit",o=Number(b(t,{convert:!0})??0),m=Number(b(n,{convert:!0})??O(String(n),10)),c=Number.isFinite(o)?o:0,h=Number.isFinite(m)&&m>0?m:10;g({newParams:{[t]:Math.max(0,c-h)}});return}let r=k?k.pageKey??"page":"page",s=Number(b(r,{convert:!0})??O(String(r),1)),a=Number.isFinite(s)&&s>0?s:1;g({newParams:{[r]:Math.max(1,a-1)}})},reset:()=>{let e=w?.mode??"page";if(e==="cursor"){let a=S?.cursorKey??"cursor";g({keepParams:{[a]:!1}});return}if(e==="offset"){let a=R?.offsetKey??"offset",t=Number(O(String(a),0));g({newParams:{[a]:Number.isFinite(t)?t:0}});return}let r=k?k.pageKey??"page":"page",s=Number(O(String(r),1));g({newParams:{[r]:Number.isFinite(s)&&s>0?s:1}})},setCursor:e=>{let s=(w?.mode??"page")==="cursor"?S?.cursorKey??"cursor":"cursor";if(e==null||e===""){g({keepParams:{[s]:!1}});return}g({newParams:{[s]:e}})}},ie=(0,P.useCallback)((e,r)=>{let s=String(e);return C.current[s]=r,()=>{delete C.current[s],delete j.current[s]}},[]);return(0,P.useEffect)(()=>{for(let[e,r]of Object.entries(C.current)){let s=v(e)?x(e):i.get(e),a=j.current[e]??null;if(!_(s,a))for(let t of r)t({key:e,previousValue:a,currentValue:s});j.current[e]=s}},[N,v,i]),(0,P.useEffect)(()=>{let e=Object.keys(f),r=Object.keys(y);if(e.length===0&&r.length===0)return;function s(){let a=K(f).toString(),t=M(),n=K(t).toString();if(!W({paramsForced:y,compareParams:t})){g({newParams:{...f,...y}});return}let m=W({paramsForced:y,compareParams:f});if(e.length>0&&m){if(a===n)return;g({newParams:f})}}s()},[]),{searchParams:i,updateParams:g,clearParams:D,getParams:M,getParam:b,onChange:ie,pagination:ce}};0&&(module.exports={useMagicSearchParams});
1
+ "use strict";var E=Object.defineProperty;var le=Object.getOwnPropertyDescriptor;var pe=Object.getOwnPropertyNames;var fe=Object.prototype.hasOwnProperty;var ye=(m,f)=>{for(var y in f)E(m,y,{get:f[y],enumerable:!0})},ge=(m,f,y,l)=>{if(f&&typeof f=="object"||typeof f=="function")for(let d of pe(f))!fe.call(m,d)&&d!==y&&E(m,d,{get:()=>f[d],enumerable:!(l=le(f,d))||l.enumerable});return m};var de=m=>ge(E({},"__esModule",{value:!0}),m);var we={};ye(we,{useMagicSearchParams:()=>Z});module.exports=de(we);var X=require("react-router-dom"),P=require("react"),Z=({mandatory:m={},optional:f={},defaultParams:y={},arraySerialization:l="csv",forceParams:d={},omitParamsByValues:z=[],coerceParams:j={},codecs:L={},historyMode:I="push",resetOnChange:ee={},paginationStrategy:w,unknownParamsPolicy:N="drop"})=>{let[i,B]=(0,X.useSearchParams)(),T=(0,P.useRef)({}),U=(0,P.useRef)({}),H=(0,P.useCallback)((r,e)=>{B(r,{replace:(e??I)==="replace"})},[B,I]),p=(0,P.useMemo)(()=>({...m,...f}),[m,f]),_=(0,P.useMemo)(()=>Array.from(Object.keys(p)),[p]),S=(0,P.useCallback)(r=>Object.prototype.hasOwnProperty.call(p,r),[p]),re=r=>!Array.isArray(p[r])||l==="csv"?i.get(r):l==="repeat"?i.getAll(r):i.getAll(`${r}[]`),W=(0,P.useCallback)(()=>{if(N==="drop")return[];let r=[];for(let[e,a]of i.entries()){let s=e.endsWith("[]")?e.replace("[]",""):e;S(s)||r.push([e,a])}return r},[N,i,S]),$=(0,P.useCallback)(r=>{if(N==="drop")return r;let e=new URLSearchParams(r.toString()),a=W();for(let[s,t]of a)e.append(s,t);return e},[N,W]),D=(r,e)=>Array.isArray(r)&&Array.isArray(e)?r.length!==e.length?!1:r.every((a,s)=>a===e[s]):r===e,x=(0,P.useMemo)(()=>Object.keys(p).filter(r=>Array.isArray(p[r])),[p]),se=(r,e)=>{let a={...r};return x.length===0||x.forEach(s=>{let t=[];switch(l){case"csv":{t=(i.get(s)||"").split(",").map(o=>o.trim()).filter(Boolean);break}case"repeat":{let n=i.getAll(s);t=n.length>0?n:[];break}case"brackets":{let n=i.getAll(`${s}[]`);t=n.length>0?n:[];break}default:t=(i.get(s)??"").split(",").map(o=>o.trim()).filter(Boolean)}if(e[s]!==void 0){let n=e[s],o=[];typeof n=="string"?o=t.includes(n)?t.filter(u=>u!==n):[...t,n]:Array.isArray(n)?o=Array.from(new Set([...n.map(String)])):o=t,a[s]=o}}),a},b=r=>{let e=new URLSearchParams,a=Object.keys(r);for(let s of a){let t=L[s];if(t?.serialize){let n=t.serialize(r[s],{key:s});if(n==null)continue;if(Array.isArray(n))if(Array.isArray(p[s]))if(l==="csv")e.set(s,n.join(","));else if(l==="repeat")for(let o of n)e.append(s,String(o));else for(let o of n)e.append(`${s}[]`,String(o));else n.length>0&&e.set(s,String(n[0]));else e.set(s,String(n));continue}if(Array.isArray(p[s])){let n=r[s];switch(l){case"csv":{e.set(s,n.join(","));break}case"repeat":{for(let o of n)e.append(s,String(o));break}case"brackets":{for(let o of n)e.append(`${s}[]`,String(o));break}default:e.set(s,n.join(","))}}else e.set(s,String(r[s]))}return e},O=(r,e)=>Object.prototype.hasOwnProperty.call(m,r)?m[r]:Object.prototype.hasOwnProperty.call(y,r)?y[r]:e,Q=r=>Object.prototype.hasOwnProperty.call(f,r)?f[r]==="":!1,v=(r,e)=>{let a=Array.isArray(e)?e[0]:e,s=a==null?"":String(a).trim().toLowerCase();if(s==="true")return!0;if(s==="false")return!1;if(Q(r))return"";let t=O(r,!1);return typeof t=="boolean"?t:!1},Y=({paramsForced:r,compareParams:e})=>Object.entries(r).every(([s,t])=>e[s]===t),V=r=>{let e=re(r),a=L[r];if(a?.parse)return a.parse(e,{key:r,searchParams:i});let s=j[r];if(s==="number"){let t=Number.parseInt(String(e??""),10);if(Number.isNaN(t)){let n=O(r,0);return typeof n=="number"?n:0}return t}if(s==="boolean")return v(r,e);if(s==="array")return l==="csv"?String(e??"").split(",").filter(Boolean):Array.isArray(e)?e:e?[e]:[];if(s==="string")return Array.isArray(e)?e[0]??"":e??"";if(typeof p[r]=="number"){let t=Number.parseInt(String(e??""),10);if(Number.isNaN(t)){let n=O(r,0);return typeof n=="number"?n:0}return t}return typeof p[r]=="boolean"?v(r,e):Array.isArray(p[r])?l==="csv"?String(e??"").split(",").filter(Boolean):Array.isArray(e)?e:e?[e]:[]:Array.isArray(e)?e[0]??"":e??""},q=(r,e)=>{let a=j[r];if(!a)return e;if(a==="boolean")return v(r,e);if(a==="number"){if(typeof e=="number"&&Number.isFinite(e))return e;let s=Number.parseInt(String(e??""),10);if(Number.isNaN(s)){let t=O(r,0);return typeof t=="number"?t:0}return s}return a==="array"?Array.isArray(e)?e:e==null||e===""?[]:[String(e)]:a==="string"?Array.isArray(e)?e[0]??"":e==null?"":String(e):e},G=(r,e)=>{if(Array.isArray(p[r])){if(l==="brackets"){let t=i.getAll(`${r}[]`),n=b({[r]:t}).toString();return decodeURIComponent(n)}if(l==="csv"){let t=i.getAll(r),n=b({[r]:t}).toString();return decodeURIComponent(n)}let s=i.getAll(r);return b({[r]:s}).toString()}return e[r]},ae=r=>{let e={};for(let[a,s]of r.entries())if(a.endsWith("[]")){let t=a.replace("[]","");e[t]?e[t].push(s):e[t]=[s]}else e[a]?Array.isArray(e[a])?e[a].push(s):e[a]=[e[a],s]:e[a]=s;return e},k=(0,P.useMemo)(()=>l==="brackets"?ae(i):Object.fromEntries(i.entries()),[i,l]),M=({convert:r=!0}={})=>(r===!0?_:Object.keys(k)).reduce((a,s)=>{if(Object.prototype.hasOwnProperty.call(p,s)){let t=l==="brackets"?s.replace("[]",""):s;if(r===!0){let n=Object.prototype.hasOwnProperty.call(m,t),o=Object.prototype.hasOwnProperty.call(k,t),u=Object.prototype.hasOwnProperty.call(f,t)&&j[t]==="boolean"&&Q(t);if(!n&&!o&&!u)return a;let c=V(t);a[t]=q(t,c)}else a[t]=G(s,k)}return a},{}),h=(r,e)=>{let a=String(r);return e?.convert!==!1?q(a,V(a)):G(a,k)},te=r=>r==null||typeof r!="object"?!1:Object.prototype.hasOwnProperty.call(r,"newParams")||Object.prototype.hasOwnProperty.call(r,"keepParams")||Object.prototype.hasOwnProperty.call(r,"historyMode"),ne=r=>{let e=M({convert:!0});if(typeof r=="function"){let a=r(e);return te(a)?{newParams:typeof a.newParams=="function"?a.newParams(e):a.newParams??{},keepParams:a.keepParams??{},historyMode:a.historyMode}:{newParams:a,keepParams:{},historyMode:void 0}}return r?{newParams:typeof r.newParams=="function"?r.newParams(e):r.newParams??{},keepParams:r.keepParams??{},historyMode:r.historyMode}:{newParams:{},keepParams:{},historyMode:void 0}},oe=({currentParams:r,newParams:e,keepParams:a})=>{let s={...e},t={...a};for(let[n,o]of Object.entries(ee))if(!(!o||o.length===0||!Object.prototype.hasOwnProperty.call(s,n)||D(s[n],r[n]))){for(let c of o)if(!Object.prototype.hasOwnProperty.call(d,c)){if(Object.prototype.hasOwnProperty.call(m,c)){s[c]=m[c],delete t[c];continue}if(Object.prototype.hasOwnProperty.call(y,c)){s[c]=y[c],delete t[c];continue}delete s[c],t[c]=!1}}return{newParams:s,keepParams:t}},ce=(r,e)=>{let a=M(),s=Object.entries(r).filter(([o])=>!Array.isArray(p[o])),t=Object.assign({...a,...Object.fromEntries(s)},d),n=Object.keys(t).reduce((o,u)=>{if(Object.prototype.hasOwnProperty.call(e,u)&&e[u]===!1)return o;let c=t[u],K=typeof c=="string"&&z.includes(c);return c!=null&&c!==""&&!K&&(o[u]=c),o},{});return{...m,...n}},ie=r=>_.reduce((a,s)=>(Object.prototype.hasOwnProperty.call(r,s)&&(a[s]=r[s]),a),{}),ue=()=>{let r=x.length>0,e=M({convert:r});return Object.keys(e).reduce((s,t)=>(Object.prototype.hasOwnProperty.call(m,t)&&(s[t]=e[t]),s),{})},J=({keepMandatoryParams:r=!0,historyMode:e}={})=>{let a=b({...m,...r&&{...ue()},...d}),s=$(a);H(s,e)},g=r=>{let e=ne(r),a=M({convert:!0}),s=oe({currentParams:a,newParams:e.newParams,keepParams:e.keepParams}),t=s.newParams,n=s.keepParams;if(Object.keys(t).length===0&&Object.keys(n).length===0){J({historyMode:e.historyMode});return}let o=ce(t,n),u=se(o,t),c=ie(u),K=b(c),F=$(K);H(F,e.historyMode)},R=w?.mode==="page"?w:void 0,A=w?.mode==="offset"?w:void 0,C=w?.mode==="cursor"?w:void 0,me={mode:w?.mode??"page",next:r=>{let e=w?.mode??"page";if(e==="cursor"){let n=C?.cursorKey??"cursor";typeof r=="string"&&g({newParams:{[n]:r}});return}if(e==="offset"){let n=A?.offsetKey??"offset",o=A?.limitKey??"limit",u=Number(h(n,{convert:!0})??0),c=Number(h(o,{convert:!0})??O(String(o),10)),K=Number.isFinite(u)?u:0,F=Number.isFinite(c)&&c>0?c:10;g({newParams:{[n]:K+F}});return}let a=R?R.pageKey??"page":"page",s=Number(h(a,{convert:!0})??O(String(a),1)),t=Number.isFinite(s)&&s>0?s:1;g({newParams:{[a]:t+1}})},prev:()=>{let r=w?.mode??"page";if(r==="cursor"){let t=C?.cursorKey??"cursor";g({keepParams:{[t]:!1}});return}if(r==="offset"){let t=A?.offsetKey??"offset",n=A?.limitKey??"limit",o=Number(h(t,{convert:!0})??0),u=Number(h(n,{convert:!0})??O(String(n),10)),c=Number.isFinite(o)?o:0,K=Number.isFinite(u)&&u>0?u:10;g({newParams:{[t]:Math.max(0,c-K)}});return}let e=R?R.pageKey??"page":"page",a=Number(h(e,{convert:!0})??O(String(e),1)),s=Number.isFinite(a)&&a>0?a:1;g({newParams:{[e]:Math.max(1,s-1)}})},reset:()=>{let r=w?.mode??"page";if(r==="cursor"){let s=C?.cursorKey??"cursor";g({keepParams:{[s]:!1}});return}if(r==="offset"){let s=A?.offsetKey??"offset",t=Number(O(String(s),0));g({newParams:{[s]:Number.isFinite(t)?t:0}});return}let e=R?R.pageKey??"page":"page",a=Number(O(String(e),1));g({newParams:{[e]:Number.isFinite(a)&&a>0?a:1}})},setCursor:r=>{let a=(w?.mode??"page")==="cursor"?C?.cursorKey??"cursor":"cursor";if(r==null||r===""){g({keepParams:{[a]:!1}});return}g({newParams:{[a]:r}})}},Pe=(0,P.useCallback)((r,e)=>{let a=String(r);return T.current[a]=e,()=>{delete T.current[a],delete U.current[a]}},[]);return(0,P.useEffect)(()=>{for(let[r,e]of Object.entries(T.current)){let a=S(r)?V(r):i.get(r),s=U.current[r]??null;if(!D(a,s))for(let t of e)t({key:r,previousValue:s,currentValue:a});U.current[r]=a}},[k,S,i]),(0,P.useEffect)(()=>{let r=Object.keys(y),e=Object.keys(d);if(r.length===0&&e.length===0)return;function a(){let s=b(y).toString(),t=M(),n=b(t).toString();if(!Y({paramsForced:d,compareParams:t})){g({newParams:{...y,...d}});return}let u=Y({paramsForced:d,compareParams:y});if(r.length>0&&u){if(s===n)return;g({newParams:y})}}a()},[]),{searchParams:i,updateParams:g,clearParams:J,getParams:M,getParam:h,onChange:Pe,pagination:me}};0&&(module.exports={useMagicSearchParams});
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- import{useSearchParams as me}from"react-router-dom";import{useMemo as S,useEffect as Q,useRef as Y,useCallback as k}from"react";var ue=({mandatory:f={},optional:V={},defaultParams:g={},arraySerialization:l="csv",forceParams:d={},omitParamsByValues:q=[],coerceParams:G={},codecs:F={},historyMode:E="push",resetOnChange:J={},paginationStrategy:p,unknownParamsPolicy:R="drop"})=>{let[i,L]=me(),C=Y({}),j=Y({}),I=k((e,r)=>{L(e,{replace:(r??E)==="replace"})},[L,E]),u=S(()=>({...f,...V}),[f,V]),X=S(()=>Array.from(Object.keys(u)),[u]),A=k(e=>Object.prototype.hasOwnProperty.call(u,e),[u]),Z=e=>!Array.isArray(u[e])||l==="csv"?i.get(e):l==="repeat"?i.getAll(e):i.getAll(`${e}[]`),B=k(()=>{if(R==="drop")return[];let e=[];for(let[r,s]of i.entries()){let a=r.endsWith("[]")?r.replace("[]",""):r;A(a)||e.push([r,s])}return e},[R,i,A]),H=k(e=>{if(R==="drop")return e;let r=new URLSearchParams(e.toString()),s=B();for(let[a,t]of s)r.append(a,t);return r},[R,B]),_=(e,r)=>Array.isArray(e)&&Array.isArray(r)?e.length!==r.length?!1:e.every((s,a)=>s===r[a]):e===r,T=S(()=>Object.keys(u).filter(e=>Array.isArray(u[e])),[u]),z=(e,r)=>{let s={...e};return T.length===0||T.forEach(a=>{let t=[];switch(l){case"csv":{t=(i.get(a)||"").split(",").map(o=>o.trim()).filter(Boolean);break}case"repeat":{let n=i.getAll(a);t=n.length>0?n:[];break}case"brackets":{let n=i.getAll(`${a}[]`);t=n.length>0?n:[];break}default:t=(i.get(a)??"").split(",").map(o=>o.trim()).filter(Boolean)}if(r[a]!==void 0){let n=r[a],o=[];typeof n=="string"?o=t.includes(n)?t.filter(m=>m!==n):[...t,n]:Array.isArray(n)?o=Array.from(new Set([...n.map(String)])):o=t,s[a]=o}}),s},w=e=>{let r=new URLSearchParams,s=Object.keys(e);for(let a of s){let t=F[a];if(t?.serialize){let n=t.serialize(e[a],{key:a});if(n==null)continue;if(Array.isArray(n))if(Array.isArray(u[a]))if(l==="csv")r.set(a,n.join(","));else if(l==="repeat")for(let o of n)r.append(a,String(o));else for(let o of n)r.append(`${a}[]`,String(o));else n.length>0&&r.set(a,String(n[0]));else r.set(a,String(n));continue}if(Array.isArray(u[a])){let n=e[a];switch(l){case"csv":{r.set(a,n.join(","));break}case"repeat":{for(let o of n)r.append(a,String(o));break}case"brackets":{for(let o of n)r.append(`${a}[]`,String(o));break}default:r.set(a,n.join(","))}}else r.set(a,String(e[a]))}return r},y=(e,r)=>Object.prototype.hasOwnProperty.call(f,e)?f[e]:Object.prototype.hasOwnProperty.call(g,e)?g[e]:r,W=({paramsForced:e,compareParams:r})=>Object.entries(e).every(([a,t])=>r[a]===t),x=e=>{let r=Z(e),s=F[e];if(s?.parse)return s.parse(r,{key:e,searchParams:i});let a=G[e];if(a==="number"){let t=Number.parseInt(String(r??""),10);if(Number.isNaN(t)){let n=y(e,0);return typeof n=="number"?n:0}return t}if(a==="boolean")return String(r)==="true";if(a==="array")return l==="csv"?String(r??"").split(",").filter(Boolean):Array.isArray(r)?r:r?[r]:[];if(a==="string")return Array.isArray(r)?r[0]??"":r??"";if(typeof u[e]=="number"){let t=Number.parseInt(String(r??""),10);if(Number.isNaN(t)){let n=y(e,0);return typeof n=="number"?n:0}return t}return typeof u[e]=="boolean"?String(r)==="true":Array.isArray(u[e])?l==="csv"?String(r??"").split(",").filter(Boolean):Array.isArray(r)?r:r?[r]:[]:Array.isArray(r)?r[0]??"":r??""},$=(e,r)=>{if(Array.isArray(u[e])){if(l==="brackets"){let t=i.getAll(`${e}[]`),n=w({[e]:t}).toString();return decodeURIComponent(n)}if(l==="csv"){let t=i.getAll(e),n=w({[e]:t}).toString();return decodeURIComponent(n)}let a=i.getAll(e);return w({[e]:a}).toString()}return r[e]},ee=e=>{let r={};for(let[s,a]of e.entries())if(s.endsWith("[]")){let t=s.replace("[]","");r[t]?r[t].push(a):r[t]=[a]}else r[s]?Array.isArray(r[s])?r[s].push(a):r[s]=[r[s],a]:r[s]=a;return r},v=S(()=>l==="brackets"?ee(i):Object.fromEntries(i.entries()),[i,l]),b=({convert:e=!0}={})=>Object.keys(v).reduce((s,a)=>{if(Object.prototype.hasOwnProperty.call(u,a)){let t=l==="brackets"?a.replace("[]",""):a;s[t]=e===!0?x(t):$(a,v)}return s},{}),O=(e,r)=>{let s=String(e);return r?.convert!==!1?x(s):$(s,v)},re=e=>e==null||typeof e!="object"?!1:Object.prototype.hasOwnProperty.call(e,"newParams")||Object.prototype.hasOwnProperty.call(e,"keepParams")||Object.prototype.hasOwnProperty.call(e,"historyMode"),ae=e=>{let r=b({convert:!0});if(typeof e=="function"){let s=e(r);return re(s)?{newParams:typeof s.newParams=="function"?s.newParams(r):s.newParams??{},keepParams:s.keepParams??{},historyMode:s.historyMode}:{newParams:s,keepParams:{},historyMode:void 0}}return e?{newParams:typeof e.newParams=="function"?e.newParams(r):e.newParams??{},keepParams:e.keepParams??{},historyMode:e.historyMode}:{newParams:{},keepParams:{},historyMode:void 0}},se=({currentParams:e,newParams:r,keepParams:s})=>{let a={...r},t={...s};for(let[n,o]of Object.entries(J))if(!(!o||o.length===0||!Object.prototype.hasOwnProperty.call(a,n)||_(a[n],e[n]))){for(let c of o)if(!Object.prototype.hasOwnProperty.call(d,c)){if(Object.prototype.hasOwnProperty.call(f,c)){a[c]=f[c],delete t[c];continue}if(Object.prototype.hasOwnProperty.call(g,c)){a[c]=g[c],delete t[c];continue}delete a[c],t[c]=!1}}return{newParams:a,keepParams:t}},te=(e,r)=>{let s=b(),a=Object.entries(e).filter(([o])=>!Array.isArray(u[o])),t=Object.assign({...s,...Object.fromEntries(a)},d),n=Object.keys(t).reduce((o,m)=>{if(Object.prototype.hasOwnProperty.call(r,m)&&r[m]===!1)return o;let c=t[m],K=typeof c=="string"&&q.includes(c);return c!=null&&c!==""&&!K&&(o[m]=c),o},{});return{...f,...n}},ne=e=>X.reduce((s,a)=>(Object.prototype.hasOwnProperty.call(e,a)&&(s[a]=e[a]),s),{}),oe=()=>{let e=T.length>0,r=b({convert:e});return Object.keys(r).reduce((a,t)=>(Object.prototype.hasOwnProperty.call(f,t)&&(a[t]=r[t]),a),{})},D=({keepMandatoryParams:e=!0,historyMode:r}={})=>{let s=w({...f,...e&&{...oe()},...d}),a=H(s);I(a,r)},P=e=>{let r=ae(e),s=b({convert:!0}),a=se({currentParams:s,newParams:r.newParams,keepParams:r.keepParams}),t=a.newParams,n=a.keepParams;if(Object.keys(t).length===0&&Object.keys(n).length===0){D({historyMode:r.historyMode});return}let o=te(t,n),m=z(o,t),c=ne(m),K=w(c),U=H(K);I(U,r.historyMode)},h=p?.mode==="page"?p:void 0,M=p?.mode==="offset"?p:void 0,N=p?.mode==="cursor"?p:void 0,ce={mode:p?.mode??"page",next:e=>{let r=p?.mode??"page";if(r==="cursor"){let n=N?.cursorKey??"cursor";typeof e=="string"&&P({newParams:{[n]:e}});return}if(r==="offset"){let n=M?.offsetKey??"offset",o=M?.limitKey??"limit",m=Number(O(n,{convert:!0})??0),c=Number(O(o,{convert:!0})??y(String(o),10)),K=Number.isFinite(m)?m:0,U=Number.isFinite(c)&&c>0?c:10;P({newParams:{[n]:K+U}});return}let s=h?h.pageKey??"page":"page",a=Number(O(s,{convert:!0})??y(String(s),1)),t=Number.isFinite(a)&&a>0?a:1;P({newParams:{[s]:t+1}})},prev:()=>{let e=p?.mode??"page";if(e==="cursor"){let t=N?.cursorKey??"cursor";P({keepParams:{[t]:!1}});return}if(e==="offset"){let t=M?.offsetKey??"offset",n=M?.limitKey??"limit",o=Number(O(t,{convert:!0})??0),m=Number(O(n,{convert:!0})??y(String(n),10)),c=Number.isFinite(o)?o:0,K=Number.isFinite(m)&&m>0?m:10;P({newParams:{[t]:Math.max(0,c-K)}});return}let r=h?h.pageKey??"page":"page",s=Number(O(r,{convert:!0})??y(String(r),1)),a=Number.isFinite(s)&&s>0?s:1;P({newParams:{[r]:Math.max(1,a-1)}})},reset:()=>{let e=p?.mode??"page";if(e==="cursor"){let a=N?.cursorKey??"cursor";P({keepParams:{[a]:!1}});return}if(e==="offset"){let a=M?.offsetKey??"offset",t=Number(y(String(a),0));P({newParams:{[a]:Number.isFinite(t)?t:0}});return}let r=h?h.pageKey??"page":"page",s=Number(y(String(r),1));P({newParams:{[r]:Number.isFinite(s)&&s>0?s:1}})},setCursor:e=>{let s=(p?.mode??"page")==="cursor"?N?.cursorKey??"cursor":"cursor";if(e==null||e===""){P({keepParams:{[s]:!1}});return}P({newParams:{[s]:e}})}},ie=k((e,r)=>{let s=String(e);return C.current[s]=r,()=>{delete C.current[s],delete j.current[s]}},[]);return Q(()=>{for(let[e,r]of Object.entries(C.current)){let s=A(e)?x(e):i.get(e),a=j.current[e]??null;if(!_(s,a))for(let t of r)t({key:e,previousValue:a,currentValue:s});j.current[e]=s}},[v,A,i]),Q(()=>{let e=Object.keys(g),r=Object.keys(d);if(e.length===0&&r.length===0)return;function s(){let a=w(g).toString(),t=b(),n=w(t).toString();if(!W({paramsForced:d,compareParams:t})){P({newParams:{...g,...d}});return}let m=W({paramsForced:d,compareParams:g});if(e.length>0&&m){if(a===n)return;P({newParams:g})}}s()},[]),{searchParams:i,updateParams:P,clearParams:D,getParams:b,getParam:O,onChange:ie,pagination:ce}};export{ue as useMagicSearchParams};
1
+ import{useSearchParams as le}from"react-router-dom";import{useMemo as j,useEffect as X,useRef as Z,useCallback as A}from"react";var pe=({mandatory:f={},optional:M={},defaultParams:g={},arraySerialization:l="csv",forceParams:d={},omitParamsByValues:z=[],coerceParams:T={},codecs:L={},historyMode:I="push",resetOnChange:ee={},paginationStrategy:p,unknownParamsPolicy:N="drop"})=>{let[i,B]=le(),U=Z({}),x=Z({}),H=A((r,e)=>{B(r,{replace:(e??I)==="replace"})},[B,I]),m=j(()=>({...f,...M}),[f,M]),_=j(()=>Array.from(Object.keys(m)),[m]),S=A(r=>Object.prototype.hasOwnProperty.call(m,r),[m]),re=r=>!Array.isArray(m[r])||l==="csv"?i.get(r):l==="repeat"?i.getAll(r):i.getAll(`${r}[]`),W=A(()=>{if(N==="drop")return[];let r=[];for(let[e,a]of i.entries()){let s=e.endsWith("[]")?e.replace("[]",""):e;S(s)||r.push([e,a])}return r},[N,i,S]),$=A(r=>{if(N==="drop")return r;let e=new URLSearchParams(r.toString()),a=W();for(let[s,t]of a)e.append(s,t);return e},[N,W]),D=(r,e)=>Array.isArray(r)&&Array.isArray(e)?r.length!==e.length?!1:r.every((a,s)=>a===e[s]):r===e,v=j(()=>Object.keys(m).filter(r=>Array.isArray(m[r])),[m]),se=(r,e)=>{let a={...r};return v.length===0||v.forEach(s=>{let t=[];switch(l){case"csv":{t=(i.get(s)||"").split(",").map(o=>o.trim()).filter(Boolean);break}case"repeat":{let n=i.getAll(s);t=n.length>0?n:[];break}case"brackets":{let n=i.getAll(`${s}[]`);t=n.length>0?n:[];break}default:t=(i.get(s)??"").split(",").map(o=>o.trim()).filter(Boolean)}if(e[s]!==void 0){let n=e[s],o=[];typeof n=="string"?o=t.includes(n)?t.filter(u=>u!==n):[...t,n]:Array.isArray(n)?o=Array.from(new Set([...n.map(String)])):o=t,a[s]=o}}),a},w=r=>{let e=new URLSearchParams,a=Object.keys(r);for(let s of a){let t=L[s];if(t?.serialize){let n=t.serialize(r[s],{key:s});if(n==null)continue;if(Array.isArray(n))if(Array.isArray(m[s]))if(l==="csv")e.set(s,n.join(","));else if(l==="repeat")for(let o of n)e.append(s,String(o));else for(let o of n)e.append(`${s}[]`,String(o));else n.length>0&&e.set(s,String(n[0]));else e.set(s,String(n));continue}if(Array.isArray(m[s])){let n=r[s];switch(l){case"csv":{e.set(s,n.join(","));break}case"repeat":{for(let o of n)e.append(s,String(o));break}case"brackets":{for(let o of n)e.append(`${s}[]`,String(o));break}default:e.set(s,n.join(","))}}else e.set(s,String(r[s]))}return e},y=(r,e)=>Object.prototype.hasOwnProperty.call(f,r)?f[r]:Object.prototype.hasOwnProperty.call(g,r)?g[r]:e,Q=r=>Object.prototype.hasOwnProperty.call(M,r)?M[r]==="":!1,V=(r,e)=>{let a=Array.isArray(e)?e[0]:e,s=a==null?"":String(a).trim().toLowerCase();if(s==="true")return!0;if(s==="false")return!1;if(Q(r))return"";let t=y(r,!1);return typeof t=="boolean"?t:!1},Y=({paramsForced:r,compareParams:e})=>Object.entries(r).every(([s,t])=>e[s]===t),F=r=>{let e=re(r),a=L[r];if(a?.parse)return a.parse(e,{key:r,searchParams:i});let s=T[r];if(s==="number"){let t=Number.parseInt(String(e??""),10);if(Number.isNaN(t)){let n=y(r,0);return typeof n=="number"?n:0}return t}if(s==="boolean")return V(r,e);if(s==="array")return l==="csv"?String(e??"").split(",").filter(Boolean):Array.isArray(e)?e:e?[e]:[];if(s==="string")return Array.isArray(e)?e[0]??"":e??"";if(typeof m[r]=="number"){let t=Number.parseInt(String(e??""),10);if(Number.isNaN(t)){let n=y(r,0);return typeof n=="number"?n:0}return t}return typeof m[r]=="boolean"?V(r,e):Array.isArray(m[r])?l==="csv"?String(e??"").split(",").filter(Boolean):Array.isArray(e)?e:e?[e]:[]:Array.isArray(e)?e[0]??"":e??""},q=(r,e)=>{let a=T[r];if(!a)return e;if(a==="boolean")return V(r,e);if(a==="number"){if(typeof e=="number"&&Number.isFinite(e))return e;let s=Number.parseInt(String(e??""),10);if(Number.isNaN(s)){let t=y(r,0);return typeof t=="number"?t:0}return s}return a==="array"?Array.isArray(e)?e:e==null||e===""?[]:[String(e)]:a==="string"?Array.isArray(e)?e[0]??"":e==null?"":String(e):e},G=(r,e)=>{if(Array.isArray(m[r])){if(l==="brackets"){let t=i.getAll(`${r}[]`),n=w({[r]:t}).toString();return decodeURIComponent(n)}if(l==="csv"){let t=i.getAll(r),n=w({[r]:t}).toString();return decodeURIComponent(n)}let s=i.getAll(r);return w({[r]:s}).toString()}return e[r]},ae=r=>{let e={};for(let[a,s]of r.entries())if(a.endsWith("[]")){let t=a.replace("[]","");e[t]?e[t].push(s):e[t]=[s]}else e[a]?Array.isArray(e[a])?e[a].push(s):e[a]=[e[a],s]:e[a]=s;return e},R=j(()=>l==="brackets"?ae(i):Object.fromEntries(i.entries()),[i,l]),h=({convert:r=!0}={})=>(r===!0?_:Object.keys(R)).reduce((a,s)=>{if(Object.prototype.hasOwnProperty.call(m,s)){let t=l==="brackets"?s.replace("[]",""):s;if(r===!0){let n=Object.prototype.hasOwnProperty.call(f,t),o=Object.prototype.hasOwnProperty.call(R,t),u=Object.prototype.hasOwnProperty.call(M,t)&&T[t]==="boolean"&&Q(t);if(!n&&!o&&!u)return a;let c=F(t);a[t]=q(t,c)}else a[t]=G(s,R)}return a},{}),O=(r,e)=>{let a=String(r);return e?.convert!==!1?q(a,F(a)):G(a,R)},te=r=>r==null||typeof r!="object"?!1:Object.prototype.hasOwnProperty.call(r,"newParams")||Object.prototype.hasOwnProperty.call(r,"keepParams")||Object.prototype.hasOwnProperty.call(r,"historyMode"),ne=r=>{let e=h({convert:!0});if(typeof r=="function"){let a=r(e);return te(a)?{newParams:typeof a.newParams=="function"?a.newParams(e):a.newParams??{},keepParams:a.keepParams??{},historyMode:a.historyMode}:{newParams:a,keepParams:{},historyMode:void 0}}return r?{newParams:typeof r.newParams=="function"?r.newParams(e):r.newParams??{},keepParams:r.keepParams??{},historyMode:r.historyMode}:{newParams:{},keepParams:{},historyMode:void 0}},oe=({currentParams:r,newParams:e,keepParams:a})=>{let s={...e},t={...a};for(let[n,o]of Object.entries(ee))if(!(!o||o.length===0||!Object.prototype.hasOwnProperty.call(s,n)||D(s[n],r[n]))){for(let c of o)if(!Object.prototype.hasOwnProperty.call(d,c)){if(Object.prototype.hasOwnProperty.call(f,c)){s[c]=f[c],delete t[c];continue}if(Object.prototype.hasOwnProperty.call(g,c)){s[c]=g[c],delete t[c];continue}delete s[c],t[c]=!1}}return{newParams:s,keepParams:t}},ce=(r,e)=>{let a=h(),s=Object.entries(r).filter(([o])=>!Array.isArray(m[o])),t=Object.assign({...a,...Object.fromEntries(s)},d),n=Object.keys(t).reduce((o,u)=>{if(Object.prototype.hasOwnProperty.call(e,u)&&e[u]===!1)return o;let c=t[u],b=typeof c=="string"&&z.includes(c);return c!=null&&c!==""&&!b&&(o[u]=c),o},{});return{...f,...n}},ie=r=>_.reduce((a,s)=>(Object.prototype.hasOwnProperty.call(r,s)&&(a[s]=r[s]),a),{}),ue=()=>{let r=v.length>0,e=h({convert:r});return Object.keys(e).reduce((s,t)=>(Object.prototype.hasOwnProperty.call(f,t)&&(s[t]=e[t]),s),{})},J=({keepMandatoryParams:r=!0,historyMode:e}={})=>{let a=w({...f,...r&&{...ue()},...d}),s=$(a);H(s,e)},P=r=>{let e=ne(r),a=h({convert:!0}),s=oe({currentParams:a,newParams:e.newParams,keepParams:e.keepParams}),t=s.newParams,n=s.keepParams;if(Object.keys(t).length===0&&Object.keys(n).length===0){J({historyMode:e.historyMode});return}let o=ce(t,n),u=se(o,t),c=ie(u),b=w(c),E=$(b);H(E,e.historyMode)},K=p?.mode==="page"?p:void 0,k=p?.mode==="offset"?p:void 0,C=p?.mode==="cursor"?p:void 0,me={mode:p?.mode??"page",next:r=>{let e=p?.mode??"page";if(e==="cursor"){let n=C?.cursorKey??"cursor";typeof r=="string"&&P({newParams:{[n]:r}});return}if(e==="offset"){let n=k?.offsetKey??"offset",o=k?.limitKey??"limit",u=Number(O(n,{convert:!0})??0),c=Number(O(o,{convert:!0})??y(String(o),10)),b=Number.isFinite(u)?u:0,E=Number.isFinite(c)&&c>0?c:10;P({newParams:{[n]:b+E}});return}let a=K?K.pageKey??"page":"page",s=Number(O(a,{convert:!0})??y(String(a),1)),t=Number.isFinite(s)&&s>0?s:1;P({newParams:{[a]:t+1}})},prev:()=>{let r=p?.mode??"page";if(r==="cursor"){let t=C?.cursorKey??"cursor";P({keepParams:{[t]:!1}});return}if(r==="offset"){let t=k?.offsetKey??"offset",n=k?.limitKey??"limit",o=Number(O(t,{convert:!0})??0),u=Number(O(n,{convert:!0})??y(String(n),10)),c=Number.isFinite(o)?o:0,b=Number.isFinite(u)&&u>0?u:10;P({newParams:{[t]:Math.max(0,c-b)}});return}let e=K?K.pageKey??"page":"page",a=Number(O(e,{convert:!0})??y(String(e),1)),s=Number.isFinite(a)&&a>0?a:1;P({newParams:{[e]:Math.max(1,s-1)}})},reset:()=>{let r=p?.mode??"page";if(r==="cursor"){let s=C?.cursorKey??"cursor";P({keepParams:{[s]:!1}});return}if(r==="offset"){let s=k?.offsetKey??"offset",t=Number(y(String(s),0));P({newParams:{[s]:Number.isFinite(t)?t:0}});return}let e=K?K.pageKey??"page":"page",a=Number(y(String(e),1));P({newParams:{[e]:Number.isFinite(a)&&a>0?a:1}})},setCursor:r=>{let a=(p?.mode??"page")==="cursor"?C?.cursorKey??"cursor":"cursor";if(r==null||r===""){P({keepParams:{[a]:!1}});return}P({newParams:{[a]:r}})}},Pe=A((r,e)=>{let a=String(r);return U.current[a]=e,()=>{delete U.current[a],delete x.current[a]}},[]);return X(()=>{for(let[r,e]of Object.entries(U.current)){let a=S(r)?F(r):i.get(r),s=x.current[r]??null;if(!D(a,s))for(let t of e)t({key:r,previousValue:s,currentValue:a});x.current[r]=a}},[R,S,i]),X(()=>{let r=Object.keys(g),e=Object.keys(d);if(r.length===0&&e.length===0)return;function a(){let s=w(g).toString(),t=h(),n=w(t).toString();if(!Y({paramsForced:d,compareParams:t})){P({newParams:{...g,...d}});return}let u=Y({paramsForced:d,compareParams:g});if(r.length>0&&u){if(s===n)return;P({newParams:g})}}a()},[]),{searchParams:i,updateParams:P,clearParams:J,getParams:h,getParam:O,onChange:Pe,pagination:me}};export{pe as useMagicSearchParams};
package/package.json CHANGED
@@ -24,7 +24,7 @@
24
24
  "pagination",
25
25
  "sorting"
26
26
  ],
27
- "version": "2.2.2",
27
+ "version": "2.3.0",
28
28
  "private": false,
29
29
  "license": "MIT",
30
30
  "main": "dist/index.cjs",
@@ -45,12 +45,14 @@
45
45
  "typecheck": "tsc --noEmit",
46
46
  "build": "tsup",
47
47
  "test": "vitest run --environment jsdom",
48
+ "test:dist": "vitest run --environment jsdom test/useMagicSearchParams.dist.test.tsx",
48
49
  "test:watch": "vitest --environment jsdom",
49
50
  "lint": "tsc --noEmit",
50
51
  "prepare": "tsup",
52
+ "prepublishOnly": "pnpm run typecheck && pnpm test && pnpm run build && pnpm run test:dist",
51
53
  "size": "size-limit",
52
54
  "analyze": "size-limit --why",
53
- "prepack": "node -e \"const fs=require('fs');fs.copyFileSync('README.md','.README.repo.md');fs.copyFileSync('README_NPM.md','README.md');\"",
55
+ "prepack": "pnpm run build && node -e \"const fs=require('fs');fs.copyFileSync('README.md','.README.repo.md');fs.copyFileSync('README_NPM.md','README.md');\"",
54
56
  "postpack": "node -e \"const fs=require('fs');if(fs.existsSync('.README.repo.md')){fs.copyFileSync('.README.repo.md','README.md');fs.unlinkSync('.README.repo.md');}\""
55
57
  },
56
58
  "peerDependencies": {