react-magic-search-params 2.1.2 → 2.2.2
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 +12 -0
- package/dist/index.cjs +1 -1
- package/dist/index.d.mts +5 -2
- package/dist/index.d.ts +5 -2
- package/dist/index.js +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -54,6 +54,18 @@ updateParams({ newParams: { tags: 'react' } });
|
|
|
54
54
|
clearParams({ keepMandatoryParams: true });
|
|
55
55
|
```
|
|
56
56
|
|
|
57
|
+
If you have ambiguous optional unions (for example `boolean | ''`), use `coerceParams`:
|
|
58
|
+
|
|
59
|
+
```tsx
|
|
60
|
+
const { getParams } = useMagicSearchParams({
|
|
61
|
+
mandatory: { page: 1, page_size: 50 },
|
|
62
|
+
optional: { only_unmapped: '' as boolean | '' },
|
|
63
|
+
coerceParams: { only_unmapped: 'boolean' },
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
const { only_unmapped } = getParams({ convert: true });
|
|
67
|
+
```
|
|
68
|
+
|
|
57
69
|
## API
|
|
58
70
|
|
|
59
71
|
- `getParams({ convert?: boolean })`
|
package/dist/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var V=Object.defineProperty;var
|
|
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});
|
package/dist/index.d.mts
CHANGED
|
@@ -20,6 +20,8 @@ type ParamCodecs<TParams extends Record<string, unknown>> = Partial<{
|
|
|
20
20
|
[K in keyof TParams]: ParamCodec<TParams[K]>;
|
|
21
21
|
}>;
|
|
22
22
|
type ParamKey<TParams extends Record<string, unknown>> = Extract<keyof TParams, string>;
|
|
23
|
+
type CoerceParamType = 'string' | 'number' | 'boolean' | 'array';
|
|
24
|
+
type CoerceParams<TParams extends Record<string, unknown>> = Partial<Record<ParamKey<TParams>, CoerceParamType>>;
|
|
23
25
|
type PaginationStrategy<TParams extends Record<string, unknown>> = {
|
|
24
26
|
mode: 'page';
|
|
25
27
|
pageKey?: ParamKey<TParams>;
|
|
@@ -53,6 +55,7 @@ interface UseMagicSearchParamsOptions<M extends Record<string, unknown>, O exten
|
|
|
53
55
|
forceParams?: Partial<MergeParams<M, O>>;
|
|
54
56
|
arraySerialization?: 'csv' | 'repeat' | 'brackets';
|
|
55
57
|
omitParamsByValues?: Array<OmitParamValue>;
|
|
58
|
+
coerceParams?: CoerceParams<MergeParams<M, O>>;
|
|
56
59
|
codecs?: ParamCodecs<MergeParams<M, O>>;
|
|
57
60
|
historyMode?: HistoryMode;
|
|
58
61
|
resetOnChange?: ResetOnChangeRules<MergeParams<M, O>>;
|
|
@@ -67,7 +70,7 @@ Generic hook to handle search parameters in the URL
|
|
|
67
70
|
@param forceParams - Parameters forced into the URL regardless of user input
|
|
68
71
|
@param omitParamsByValues - Parameters omitted if they have specific values
|
|
69
72
|
*/
|
|
70
|
-
declare const useMagicSearchParams: <M extends Record<string, unknown> & CommonParams, O extends Record<string, unknown>>({ mandatory, optional, defaultParams, arraySerialization, forceParams, omitParamsByValues, codecs, historyMode, resetOnChange, paginationStrategy, unknownParamsPolicy }: UseMagicSearchParamsOptions<M, O>) => {
|
|
73
|
+
declare const useMagicSearchParams: <M extends Record<string, unknown> & CommonParams, O extends Record<string, unknown>>({ mandatory, optional, defaultParams, arraySerialization, forceParams, omitParamsByValues, coerceParams, codecs, historyMode, resetOnChange, paginationStrategy, unknownParamsPolicy }: UseMagicSearchParamsOptions<M, O>) => {
|
|
71
74
|
searchParams: URLSearchParams;
|
|
72
75
|
updateParams: (input?: {
|
|
73
76
|
newParams?: Partial<MergeParams<M, O>> | ((current: MergeParams<M, O>) => Partial<MergeParams<M, O>>);
|
|
@@ -98,4 +101,4 @@ declare const useMagicSearchParams: <M extends Record<string, unknown> & CommonP
|
|
|
98
101
|
};
|
|
99
102
|
};
|
|
100
103
|
|
|
101
|
-
export { type BuiltInOmitParamValue, type HistoryMode, type OmitParamValue, type OnChangeEvent, type PaginationStrategy, type ParamCodec, type ResetOnChangeRules, type UnknownParamsPolicy, type UseMagicSearchParamsOptions, useMagicSearchParams };
|
|
104
|
+
export { type BuiltInOmitParamValue, type CoerceParamType, type CoerceParams, type HistoryMode, type OmitParamValue, type OnChangeEvent, type PaginationStrategy, type ParamCodec, type ResetOnChangeRules, type UnknownParamsPolicy, type UseMagicSearchParamsOptions, useMagicSearchParams };
|
package/dist/index.d.ts
CHANGED
|
@@ -20,6 +20,8 @@ type ParamCodecs<TParams extends Record<string, unknown>> = Partial<{
|
|
|
20
20
|
[K in keyof TParams]: ParamCodec<TParams[K]>;
|
|
21
21
|
}>;
|
|
22
22
|
type ParamKey<TParams extends Record<string, unknown>> = Extract<keyof TParams, string>;
|
|
23
|
+
type CoerceParamType = 'string' | 'number' | 'boolean' | 'array';
|
|
24
|
+
type CoerceParams<TParams extends Record<string, unknown>> = Partial<Record<ParamKey<TParams>, CoerceParamType>>;
|
|
23
25
|
type PaginationStrategy<TParams extends Record<string, unknown>> = {
|
|
24
26
|
mode: 'page';
|
|
25
27
|
pageKey?: ParamKey<TParams>;
|
|
@@ -53,6 +55,7 @@ interface UseMagicSearchParamsOptions<M extends Record<string, unknown>, O exten
|
|
|
53
55
|
forceParams?: Partial<MergeParams<M, O>>;
|
|
54
56
|
arraySerialization?: 'csv' | 'repeat' | 'brackets';
|
|
55
57
|
omitParamsByValues?: Array<OmitParamValue>;
|
|
58
|
+
coerceParams?: CoerceParams<MergeParams<M, O>>;
|
|
56
59
|
codecs?: ParamCodecs<MergeParams<M, O>>;
|
|
57
60
|
historyMode?: HistoryMode;
|
|
58
61
|
resetOnChange?: ResetOnChangeRules<MergeParams<M, O>>;
|
|
@@ -67,7 +70,7 @@ Generic hook to handle search parameters in the URL
|
|
|
67
70
|
@param forceParams - Parameters forced into the URL regardless of user input
|
|
68
71
|
@param omitParamsByValues - Parameters omitted if they have specific values
|
|
69
72
|
*/
|
|
70
|
-
declare const useMagicSearchParams: <M extends Record<string, unknown> & CommonParams, O extends Record<string, unknown>>({ mandatory, optional, defaultParams, arraySerialization, forceParams, omitParamsByValues, codecs, historyMode, resetOnChange, paginationStrategy, unknownParamsPolicy }: UseMagicSearchParamsOptions<M, O>) => {
|
|
73
|
+
declare const useMagicSearchParams: <M extends Record<string, unknown> & CommonParams, O extends Record<string, unknown>>({ mandatory, optional, defaultParams, arraySerialization, forceParams, omitParamsByValues, coerceParams, codecs, historyMode, resetOnChange, paginationStrategy, unknownParamsPolicy }: UseMagicSearchParamsOptions<M, O>) => {
|
|
71
74
|
searchParams: URLSearchParams;
|
|
72
75
|
updateParams: (input?: {
|
|
73
76
|
newParams?: Partial<MergeParams<M, O>> | ((current: MergeParams<M, O>) => Partial<MergeParams<M, O>>);
|
|
@@ -98,4 +101,4 @@ declare const useMagicSearchParams: <M extends Record<string, unknown> & CommonP
|
|
|
98
101
|
};
|
|
99
102
|
};
|
|
100
103
|
|
|
101
|
-
export { type BuiltInOmitParamValue, type HistoryMode, type OmitParamValue, type OnChangeEvent, type PaginationStrategy, type ParamCodec, type ResetOnChangeRules, type UnknownParamsPolicy, type UseMagicSearchParamsOptions, useMagicSearchParams };
|
|
104
|
+
export { type BuiltInOmitParamValue, type CoerceParamType, type CoerceParams, type HistoryMode, type OmitParamValue, type OnChangeEvent, type PaginationStrategy, type ParamCodec, type ResetOnChangeRules, type UnknownParamsPolicy, type UseMagicSearchParamsOptions, useMagicSearchParams };
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{useSearchParams as
|
|
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};
|