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 +8 -0
- package/dist/index.cjs +1 -1
- package/dist/index.js +1 -1
- package/package.json +4 -2
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
|
|
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
|
|
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.
|
|
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": {
|