next-safe-navigation
Version:
Type-safe navigation for NextJS App router
2 lines • 1.93 kB
JavaScript
import{useParams as x,useSearchParams as v}from"next/navigation";function P(a){return a?[...a.entries()].reduce((t,[s,h])=>{let o=a.getAll(s);return t[s]=o.length>1?o:h,t},{}):{}}function S(a){let t=new URLSearchParams;for(let[s,h]of Object.entries(a)){if(Array.isArray(h)){for(let o of h)t.append(s,`${o}`);continue}t.append(s,`${h}`)}return t}var f=/\[{1,2}([^[\]]+)]{1,2}/g,R=/[^[.].+[^\]]/;function g(a,t){if(a.startsWith("/")||(a=`/${a}`),f.test(a)&&!t?.params)throw new Error(`Validation missing for path params: "${a}"`);let o=r=>{let{search:n={},...e}=r??{},c=a.replace(f,(i,d)=>{let p=R.exec(d)?.[0],m=e[p??d];return Array.isArray(m)?m.join("/"):m??i}),u=S(n);return u.entries().next().done?c:[c,u.toString()].join("?")};return o.getSchemas=()=>({params:t?.params,search:t?.search}),o}function y(a){let t=a(g),s=new Map;for(let[r,n]of Object.entries(t)){let e=n.getSchemas();if(n.getSchemas=void 0,(e.params!=null||e.search!=null)&&s.set(r,e),e.params){let c=e.params;n.$parseParams=u=>{let i=c.safeParse(u);if(!i.success)throw new Error(`Invalid route params for route "${r}": ${i.error.message}`);return i.data}}if(e.search){let c=e.search;n.$parseSearchParams=u=>{let i=c.safeParse(u);if(!i.success)throw new Error(`Invalid search params for route "${r}": ${i.error.message}`);return i.data}}}function h(r){let n=s.get(r);if(!n?.params)throw new Error(`Route "${r}" does not have params validation`);let e=n.params.safeParse(x());if(!e.success)throw new Error(`Invalid route params for route "${r}": ${e.error.message}`);return e.data}function o(r){let n=s.get(r);if(!n?.search)throw new Error(`Route "${r}" does not have searchParams validation`);let e=n.search.safeParse(P(v()));if(!e.success)throw new Error(`Invalid search params for route "${r}": ${e.error.message}`);return e.data}return{routes:t,useSafeParams:h,useSafeSearchParams:o}}export{y as createNavigationConfig};
//# sourceMappingURL=index.mjs.map