@argon-router/core 0.1.3 → 0.2.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/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const i=require("effector"),D=require("patronum");function N(t,n){var e=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);n&&(r=r.filter(function(a){return Object.getOwnPropertyDescriptor(t,a).enumerable})),e.push.apply(e,r)}return e}function P(t){for(var n=1;n<arguments.length;n++){var e=arguments[n]!=null?arguments[n]:{};n%2?N(Object(e),!0).forEach(function(r){M(t,r,e[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(e)):N(Object(e)).forEach(function(r){Object.defineProperty(t,r,Object.getOwnPropertyDescriptor(e,r))})}return t}function M(t,n,e){return(n=q(n))in t?Object.defineProperty(t,n,{value:e,enumerable:!0,configurable:!0,writable:!0}):t[n]=e,t}function q(t){var n=z(t,"string");return typeof n=="symbol"?n:n+""}function z(t,n){if(typeof t!="object"||!t)return t;var e=t[Symbol.toPrimitive];if(e!==void 0){var r=e.call(t,n||"default");if(typeof r!="object")return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return(n==="string"?String:Number)(t)}function J(t){let n;const e=i.createEffect(()=>{var y;return(y=n)===null||y===void 0?void 0:y()},{name:"waitForAsyncBundleFx",sid:"hl1gh5"}),r=i.createEffect(async()=>{for(const p of(y=t.beforeOpen)!==null&&y!==void 0?y:[]){var y;await p()}},{name:"beforeOpenFx",sid:"jez0xa"}),a=i.createEffect(async y=>(await e(),await r(),t.parent&&await t.parent.internal.openFx(P(P({},y),{},{historyIgnore:!0})),y),{name:"openFx",sid:"-uafnek"}),s=i.createStore({},{name:"$params",sid:"dlh2xl"}),o=i.createStore(!1,{name:"$isOpened",sid:"lcu7f1"}),c=a.pending,l=i.createEvent({name:"open",sid:"-qjaufd"}),u=i.createEvent({name:"close",sid:"-6cg68t"}),m=i.createEvent({name:"opened",sid:"-a2kpe7"}),d=i.createEvent({name:"openedOnServer",sid:"-u0yshs"}),g=i.createEvent({name:"openedOnClient",sid:"-u3faft"}),b=i.createEvent({name:"closed",sid:"-d6sqbp"});return i.sample({and:[{clock:l,target:a}],or:{sid:"sre3h1"}}),i.split({and:[{source:a.doneData,match:()=>typeof window>"u"?"server":"client",cases:{server:d,client:g}}],or:{sid:"t5oqwf"}}),i.sample({and:[{clock:[g,d],target:m}],or:{sid:"tamw8o"}}),i.sample({and:[{clock:m,fn:()=>!0,target:o}],or:{sid:"toxjo2"}}),i.sample({and:[{clock:u,target:b}],or:{sid:"u3rzot"}}),i.sample({and:[{clock:b,fn:()=>!1,target:o}],or:{sid:"u6iynm"}}),{$params:s,$isOpened:o,$isPending:c,open:l,closed:b,opened:m,openedOnClient:g,openedOnServer:d,internal:P({index:!1,close:u,openFx:a,setAsyncImport:y=>n=y},t),"@@unitShape":()=>({params:s,isPending:c,isOpened:o,onOpen:l})}}var E={};Object.defineProperty(E,"__esModule",{value:!0});E.TokenData=void 0;E.parse=F;var K=E.compile=Y,V=E.match=ee;E.pathToRegexp=H;E.stringify=re;const R="/",A=t=>t,L=/^[$_\p{ID_Start}]$/u,T=/^[$\u200c\u200d\p{ID_Continue}]$/u,O="https://git.new/pathToRegexpError",Q={"{":"{","}":"}","(":"(",")":")","[":"[","]":"]","+":"+","?":"?","!":"!"};function W(t){return t.replace(/[{}()\[\]+?!:*]/g,"\\$&")}function w(t){return t.replace(/[.+*?^${}()[\]|/\\]/g,"\\$&")}function*G(t){const n=[...t];let e=0;function r(){let a="";if(L.test(n[++e]))for(a+=n[e];T.test(n[++e]);)a+=n[e];else if(n[e]==='"'){let s=e;for(;e<n.length;){if(n[++e]==='"'){e++,s=0;break}n[e]==="\\"?a+=n[++e]:a+=n[e]}if(s)throw new TypeError(`Unterminated quote at ${s}: ${O}`)}if(!a)throw new TypeError(`Missing parameter name at ${e}: ${O}`);return a}for(;e<n.length;){const a=n[e],s=Q[a];if(s)yield{type:s,index:e++,value:a};else if(a==="\\")yield{type:"ESCAPED",index:e++,value:n[e++]};else if(a===":"){const o=r();yield{type:"PARAM",index:e,value:o}}else if(a==="*"){const o=r();yield{type:"WILDCARD",index:e,value:o}}else yield{type:"CHAR",index:e,value:n[e++]}}return{type:"END",index:e,value:""}}class X{constructor(n){this.tokens=n}peek(){if(!this._peek){const n=this.tokens.next();this._peek=n.value}return this._peek}tryConsume(n){const e=this.peek();if(e.type===n)return this._peek=void 0,e.value}consume(n){const e=this.tryConsume(n);if(e!==void 0)return e;const{type:r,index:a}=this.peek();throw new TypeError(`Unexpected ${r} at ${a}, expected ${n}: ${O}`)}text(){let n="",e;for(;e=this.tryConsume("CHAR")||this.tryConsume("ESCAPED");)n+=e;return n}}class j{constructor(n){this.tokens=n}}E.TokenData=j;function F(t,n={}){const{encodePath:e=A}=n,r=new X(G(t));function a(o){const c=[];for(;;){const l=r.text();l&&c.push({type:"text",value:e(l)});const u=r.tryConsume("PARAM");if(u){c.push({type:"param",name:u});continue}const m=r.tryConsume("WILDCARD");if(m){c.push({type:"wildcard",name:m});continue}if(r.tryConsume("{")){c.push({type:"group",tokens:a("}")});continue}return r.consume(o),c}}const s=a("END");return new j(s)}function Y(t,n={}){const{encode:e=encodeURIComponent,delimiter:r=R}=n,a=t instanceof j?t:F(t,n),s=B(a.tokens,r,e);return function(c={}){const[l,...u]=s(c);if(u.length)throw new TypeError(`Missing parameters: ${u.join(", ")}`);return l}}function B(t,n,e){const r=t.map(a=>Z(a,n,e));return a=>{const s=[""];for(const o of r){const[c,...l]=o(a);s[0]+=c,s.push(...l)}return s}}function Z(t,n,e){if(t.type==="text")return()=>[t.value];if(t.type==="group"){const a=B(t.tokens,n,e);return s=>{const[o,...c]=a(s);return c.length?[""]:[o]}}const r=e||A;return t.type==="wildcard"&&e!==!1?a=>{const s=a[t.name];if(s==null)return["",t.name];if(!Array.isArray(s)||s.length===0)throw new TypeError(`Expected "${t.name}" to be a non-empty array`);return[s.map((o,c)=>{if(typeof o!="string")throw new TypeError(`Expected "${t.name}/${c}" to be a string`);return r(o)}).join(n)]}:a=>{const s=a[t.name];if(s==null)return["",t.name];if(typeof s!="string")throw new TypeError(`Expected "${t.name}" to be a string`);return[r(s)]}}function ee(t,n={}){const{decode:e=decodeURIComponent,delimiter:r=R}=n,{regexp:a,keys:s}=H(t,n),o=s.map(c=>e===!1?A:c.type==="param"?e:l=>l.split(r).map(e));return function(l){const u=a.exec(l);if(!u)return!1;const m=u[0],d=Object.create(null);for(let g=1;g<u.length;g++){if(u[g]===void 0)continue;const b=s[g-1],y=o[g-1];d[b.name]=y(u[g])}return{path:m,params:d}}}function H(t,n={}){const{delimiter:e=R,end:r=!0,sensitive:a=!1,trailing:s=!0}=n,o=[],c=[],l=a?"":"i",m=(Array.isArray(t)?t:[t]).map(b=>b instanceof j?b:F(b,n));for(const{tokens:b}of m)for(const y of S(b,0,[])){const p=te(y,e,o);c.push(p)}let d=`^(?:${c.join("|")})`;return s&&(d+=`(?:${w(e)}$)?`),d+=r?"$":`(?=${w(e)}|$)`,{regexp:new RegExp(d,l),keys:o}}function*S(t,n,e){if(n===t.length)return yield e;const r=t[n];if(r.type==="group"){const a=e.slice();for(const s of S(r.tokens,0,a))yield*S(t,n+1,s)}else e.push(r);yield*S(t,n+1,e)}function te(t,n,e){let r="",a="",s=!0;for(let o=0;o<t.length;o++){const c=t[o];if(c.type==="text"){r+=w(c.value),a+=c.value,s||(s=c.value.includes(n));continue}if(c.type==="param"||c.type==="wildcard"){if(!s&&!a)throw new TypeError(`Missing text after "${c.name}": ${O}`);c.type==="param"?r+=`(${ne(n,s?"":a)}+)`:r+="([\\s\\S]+)",e.push(c),a="",s=!1;continue}}return r}function ne(t,n){return n.length<2?t.length<2?`[^${w(t+n)}]`:`(?:(?!${w(t)})[^${w(n)}])`:t.length<2?`(?:(?!${w(n)})[^${w(t)}])`:`(?:(?!${w(n)}|${w(t)})[\\s\\S])`}function re(t){return t.tokens.map(function n(e,r,a){if(e.type==="text")return W(e.value);if(e.type==="group")return`{${e.tokens.map(n).join("")}}`;const o=ae(e.name)&&se(a[r+1])?e.name:JSON.stringify(e.name);if(e.type==="param")return`:${o}`;if(e.type==="wildcard")return`*${o}`;throw new TypeError(`Unexpected token: ${e}`)}).join("")}function ae(t){const[n,...e]=t;return L.test(n)?e.every(r=>T.test(r)):!1}function se(t){return(t==null?void 0:t.type)!=="text"?!0:!T.test(t.value[0])}const oe=Symbol("any"),ie=Symbol("number"),ce=Symbol("string"),ue=Symbol("array"),x={any:oe,number:ie,string:ce,array:ue};function _(t,n){for(const e of t)if(!n.includes(e))return!1;return!0}function C(t,n){for(const e in n){const r=n[e];if(Array.isArray(r)&&(!t[e]||JSON.stringify(r)!==t[e]))return!1;switch(typeof r){case"number":{if(!t[e]||r.toString()!==t[e])return!1;break}case"object":{if(!t[e]||JSON.stringify(r)!==t[e])return!1;break}case"string":{if(!t[e]||r!==t[e])return!1;break}case"boolean":{if(!t[e]||!["0","1","false","true"].includes(t[e]))return!1;break}}switch(r){case x.any:{if(!t[e])return!1;break}case x.string:{if(!t[e]||Array.isArray(t[e]))return!1;break}case x.array:{if(!t[e]||!Array.isArray(t[e]))return!1;break}case x.number:{if(!t[e]||Array.isArray(t[e])||isNaN(parseInt(t[e]))&&isNaN(parseFloat(t[e])))return!1;break}}}return!0}function le(t,n){const e={};for(const r in n){const a=n[r],s=t[r];if(Array.isArray(a)){e[r]=s==="1"||s==="true";continue}switch(typeof a){case"number":{const o=t[r];e[r]=isNaN(parseInt(o))?parseFloat(o):parseInt(o);break}case"object":{e[r]=JSON.parse(s);break}case"string":e[r]=t[r];case"boolean":{const o=t[r];e[r]=o==="0"?parseFloat(o):parseInt(o);break}}switch(a){case x.any:case x.string:case x.array:{e[r]=t[r];break}case x.number:{const o=t[r];e[r]=isNaN(parseInt(o))?parseFloat(o):parseInt(o);break}}}return e}function pe(t,n){return e=>{const{parameters:r,forRoutes:a}=e,s=i.createEvent({name:"entered",sid:"-d3obu6"}),o=i.createEvent({name:"exited",sid:"-xofyk3"}),c=i.createEvent({name:"exit",sid:"-673d76"});return i.sample({and:[{source:{activeRoutes:t,query:n},filter:l=>{let{activeRoutes:u,query:m}=l;return(!a||_(a,u))&&C(m,r)},fn:l=>{let{query:u}=l;return le(u,r)}}],or:{sid:"-so0f9q"}}),i.sample({and:[{source:{activeRoutes:t,query:n},filter:l=>{let{activeRoutes:u,query:m}=l;return!((!a||_(a,u))&&C(m,r))},target:o}],or:{sid:"-s82e29"}}),{entered:s,exited:o,exit:c,getPayload:l=>Object.entries(l).reduce((u,m)=>{let[d,g]=m;return typeof r[d]=="symbol"?u[d]=g:u[d]=r[d],u},{})}}}function U(t){const n=new URLSearchParams(t.search);return{path:t.pathname,query:[...n.keys()].reduce((e,r)=>(e[r]?e[r]=n.getAll(r):e[r]=n.get(r),e),{})}}function fe(t){const{base:n="/",routes:e}=t,r=i.createStore(null,{and:{serialize:"ignore"},name:"$history",sid:"u16r0t"}),a=i.createStore([],{and:{serialize:"ignore"},name:"$activeRoutes",sid:"-lqqrv6"}),s=i.createStore({},{name:"$query",sid:"vs45yw"}),o=i.createStore(null,{name:"$path",sid:"-l9b2tp"}),c=i.createEvent({name:"setHistory",sid:"-omtidu"}),l=i.createEvent({name:"back",sid:"-cy0pa"}),u=i.createEvent({name:"forward",sid:"kuznmj"}),m=i.createEvent({name:"locationUpdated",sid:"-tuuikl"}),d=e.map(p=>{let v=p;const f=[];for(f.unshift(v.internal.path);v.internal.parent;)v=v.internal.parent,v.internal.path!=="/"&&f.unshift(v.internal.path);const h=n==="/"?f.join(""):[n,...f].join("");return{route:p,path:h,toPath:K(h),fromPath:V(h)}}),g=i.attach({and:{source:{history:r},effect:async(p,v)=>{let{history:f}=p,{path:h,query:$,replace:k}=v;if(!f)throw new Error("history not found");const I={pathname:h,query:$};k?f.replace(I):f.push(I.pathname)}},or:{name:"updateHistoryFx",sid:"-oh6nq8"}});for(const{route:p,toPath:v}of d)i.sample({and:[{clock:p.opened,source:a,filter:f=>!f.includes(p),fn:f=>[...f,p],target:a}],or:{sid:"e23xbi"}}),i.sample({and:[{clock:p.opened,filter:f=>!f.historyIgnore,fn:function(){let{params:f,query:h,replace:$}=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{params:{}};return{path:v(f),query:h??{},replace:$}},target:g}],or:{sid:"ei1yiz"}}),i.sample({and:[{clock:p.closed,source:a,fn:f=>f.filter(h=>h!==p),target:a}],or:{sid:"ezndij"}});i.sample({and:[{clock:c,target:r}],or:{sid:"ffleoa"}});const b=i.createEffect(p=>{const v=i.scopeBind(m);if(!p)throw new Error;p.listen(f=>{let{location:h}=f;v(h)})},{name:"subscribeHistoryFx",sid:"-zdjw0i"}),y=i.attach({and:{source:{query:s,path:o},effect:async p=>{let{query:v,path:f}=p;for(const{route:h,fromPath:$}of d){const k=$(f);if(k)await h.internal.openFx({query:v,params:k.params});else{h.internal.close();continue}}}},or:{name:"openRoutesByPathFx",sid:"-15o8ci"}});return i.sample({and:[{clock:r,filter:Boolean,target:b}],or:{sid:"gwdnmy"}}),i.sample({and:[{clock:r,filter:Boolean,fn:p=>U(p.location),target:i.withFactory({sid:"tbkknj",fn:()=>D.spread({targets:{path:o,query:s}}),name:"target",method:"spread"})}],or:{sid:"hb83np"}}),i.sample({and:[{clock:[m],fn:p=>U(p),target:i.withFactory({sid:"-qk3kpd",fn:()=>D.spread({targets:{path:o,query:s}}),name:"target",method:"spread"})}],or:{sid:"htdb8m"}}),i.sample({and:[{clock:o,target:y}],or:{sid:"iayq86"}}),{$query:s,$path:o,$activeRoutes:a,back:l,forward:u,routes:e,setHistory:c,mappedRoutes:d,trackQuery:pe(a,s),"@@unitShape":()=>({query:s,path:o,activeRoutes:a,onBack:l,onForward:u})}}exports.createRoute=J;exports.createRouter=fe;exports.parameters=x;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c=require("effector"),se=require("patronum");function L(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function v(e){for(var t=1;t<arguments.length;t++){var r=arguments[t]!=null?arguments[t]:{};t%2?L(Object(r),!0).forEach(function(n){oe(e,n,r[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):L(Object(r)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(r,n))})}return e}function oe(e,t,r){return(t=ie(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function ie(e){var t=ce(e,"string");return typeof t=="symbol"?t:t+""}function ce(e,t){if(typeof e!="object"||!e)return e;var r=e[Symbol.toPrimitive];if(r!==void 0){var n=r.call(e,t||"default");if(typeof n!="object")return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return(t==="string"?String:Number)(e)}function fe(e){let t;const r=c.createEffect(()=>{var m;return(m=t)===null||m===void 0?void 0:m()},{name:"waitForAsyncBundleFx",sid:"tw7mq7"}),n=c.createEffect(async()=>{for(const d of(m=e.beforeOpen)!==null&&m!==void 0?m:[]){var m;await d()}},{name:"beforeOpenFx",sid:"ls74w9"}),a=c.createEffect(async m=>(await r(),await n(),e.parent&&await e.parent.internal.openFx(v(v({},m??{params:{}}),{},{historyIgnore:!0})),m),{name:"openFx",sid:"-hz9h5i"}),s=c.createStore({},{name:"$params",sid:"fyp6wk"}),o=c.createStore(!1,{name:"$isOpened",sid:"nq2be0"}),i=a.pending,u=c.createEvent({name:"open",sid:"-e84o6b"}),l=c.createEvent({name:"close",sid:"5yq009"}),h=c.createEvent({name:"opened",sid:"28lguv"}),p=c.createEvent({name:"openedOnServer",sid:"-rnqoit"}),w=c.createEvent({name:"openedOnClient",sid:"-rq76gu"}),x=c.createEvent({name:"closed",sid:"-atkmcq"});return c.sample({and:[{clock:u,target:a}],or:{sid:"t5oqwf"}}),c.split({and:[{source:a.doneData,match:()=>typeof window>"u"?"server":"client",cases:{server:p,client:w}}],or:{sid:"t8fpv8"}}),c.sample({and:[{clock:[w,p],target:h}],or:{sid:"tphc9f"}}),c.sample({and:[{clock:h,fn:()=>!0,target:o}],or:{sid:"u3rzot"}}),c.sample({and:[{clock:l,target:x}],or:{sid:"u72r8z"}}),c.sample({and:[{clock:x,fn:()=>!1,target:o}],or:{sid:"ykn3cq"}}),{$params:s,$isOpened:o,$isPending:i,open:u,closed:x,opened:h,openedOnClient:w,openedOnServer:p,internal:v({index:!1,close:l,openFx:a,setAsyncImport:m=>t=m},e),"@@unitShape":()=>({params:s,isPending:i,isOpened:o,onOpen:u})}}var $={};Object.defineProperty($,"__esModule",{value:!0});$.TokenData=void 0;$.parse=U;var ue=$.compile=he,le=$.match=be;$.pathToRegexp=W;$.stringify=Fe;const C="/",T=e=>e,J=/^[$_\p{ID_Start}]$/u,D=/^[$\u200c\u200d\p{ID_Continue}]$/u,A="https://git.new/pathToRegexpError",de={"{":"{","}":"}","(":"(",")":")","[":"[","]":"]","+":"+","?":"?","!":"!"};function pe(e){return e.replace(/[{}()\[\]+?!:*]/g,"\\$&")}function F(e){return e.replace(/[.+*?^${}()[\]|/\\]/g,"\\$&")}function*me(e){const t=[...e];let r=0;function n(){let a="";if(J.test(t[++r]))for(a+=t[r];D.test(t[++r]);)a+=t[r];else if(t[r]==='"'){let s=r;for(;r<t.length;){if(t[++r]==='"'){r++,s=0;break}t[r]==="\\"?a+=t[++r]:a+=t[r]}if(s)throw new TypeError(`Unterminated quote at ${s}: ${A}`)}if(!a)throw new TypeError(`Missing parameter name at ${r}: ${A}`);return a}for(;r<t.length;){const a=t[r],s=de[a];if(s)yield{type:s,index:r++,value:a};else if(a==="\\")yield{type:"ESCAPED",index:r++,value:t[r++]};else if(a===":"){const o=n();yield{type:"PARAM",index:r,value:o}}else if(a==="*"){const o=n();yield{type:"WILDCARD",index:r,value:o}}else yield{type:"CHAR",index:r,value:t[r++]}}return{type:"END",index:r,value:""}}class ye{constructor(t){this.tokens=t}peek(){if(!this._peek){const t=this.tokens.next();this._peek=t.value}return this._peek}tryConsume(t){const r=this.peek();if(r.type===t)return this._peek=void 0,r.value}consume(t){const r=this.tryConsume(t);if(r!==void 0)return r;const{type:n,index:a}=this.peek();throw new TypeError(`Unexpected ${n} at ${a}, expected ${t}: ${A}`)}text(){let t="",r;for(;r=this.tryConsume("CHAR")||this.tryConsume("ESCAPED");)t+=r;return t}}class N{constructor(t){this.tokens=t}}$.TokenData=N;function U(e,t={}){const{encodePath:r=T}=t,n=new ye(me(e));function a(o){const i=[];for(;;){const u=n.text();u&&i.push({type:"text",value:r(u)});const l=n.tryConsume("PARAM");if(l){i.push({type:"param",name:l});continue}const h=n.tryConsume("WILDCARD");if(h){i.push({type:"wildcard",name:h});continue}if(n.tryConsume("{")){i.push({type:"group",tokens:a("}")});continue}return n.consume(o),i}}const s=a("END");return new N(s)}function he(e,t={}){const{encode:r=encodeURIComponent,delimiter:n=C}=t,a=e instanceof N?e:U(e,t),s=Q(a.tokens,n,r);return function(i={}){const[u,...l]=s(i);if(l.length)throw new TypeError(`Missing parameters: ${l.join(", ")}`);return u}}function Q(e,t,r){const n=e.map(a=>ge(a,t,r));return a=>{const s=[""];for(const o of n){const[i,...u]=o(a);s[0]+=i,s.push(...u)}return s}}function ge(e,t,r){if(e.type==="text")return()=>[e.value];if(e.type==="group"){const a=Q(e.tokens,t,r);return s=>{const[o,...i]=a(s);return i.length?[""]:[o]}}const n=r||T;return e.type==="wildcard"&&r!==!1?a=>{const s=a[e.name];if(s==null)return["",e.name];if(!Array.isArray(s)||s.length===0)throw new TypeError(`Expected "${e.name}" to be a non-empty array`);return[s.map((o,i)=>{if(typeof o!="string")throw new TypeError(`Expected "${e.name}/${i}" to be a string`);return n(o)}).join(t)]}:a=>{const s=a[e.name];if(s==null)return["",e.name];if(typeof s!="string")throw new TypeError(`Expected "${e.name}" to be a string`);return[n(s)]}}function be(e,t={}){const{decode:r=decodeURIComponent,delimiter:n=C}=t,{regexp:a,keys:s}=W(e,t),o=s.map(i=>r===!1?T:i.type==="param"?r:u=>u.split(n).map(r));return function(u){const l=a.exec(u);if(!l)return!1;const h=l[0],p=Object.create(null);for(let w=1;w<l.length;w++){if(l[w]===void 0)continue;const x=s[w-1],m=o[w-1];p[x.name]=m(l[w])}return{path:h,params:p}}}function W(e,t={}){const{delimiter:r=C,end:n=!0,sensitive:a=!1,trailing:s=!0}=t,o=[],i=[],u=a?"":"i",h=(Array.isArray(e)?e:[e]).map(x=>x instanceof N?x:U(x,t));for(const{tokens:x}of h)for(const m of j(x,0,[])){const d=we(m,r,o);i.push(d)}let p=`^(?:${i.join("|")})`;return s&&(p+=`(?:${F(r)}$)?`),p+=n?"$":`(?=${F(r)}|$)`,{regexp:new RegExp(p,u),keys:o}}function*j(e,t,r){if(t===e.length)return yield r;const n=e[t];if(n.type==="group"){const a=r.slice();for(const s of j(n.tokens,0,a))yield*j(e,t+1,s)}else r.push(n);yield*j(e,t+1,r)}function we(e,t,r){let n="",a="",s=!0;for(let o=0;o<e.length;o++){const i=e[o];if(i.type==="text"){n+=F(i.value),a+=i.value,s||(s=i.value.includes(t));continue}if(i.type==="param"||i.type==="wildcard"){if(!s&&!a)throw new TypeError(`Missing text after "${i.name}": ${A}`);i.type==="param"?n+=`(${xe(t,s?"":a)}+)`:n+="([\\s\\S]+)",r.push(i),a="",s=!1;continue}}return n}function xe(e,t){return t.length<2?e.length<2?`[^${F(e+t)}]`:`(?:(?!${F(e)})[^${F(t)}])`:e.length<2?`(?:(?!${F(t)})[^${F(e)}])`:`(?:(?!${F(t)}|${F(e)})[\\s\\S])`}function Fe(e){return e.tokens.map(function t(r,n,a){if(r.type==="text")return pe(r.value);if(r.type==="group")return`{${r.tokens.map(t).join("")}}`;const o=Se(r.name)&&Ee(a[n+1])?r.name:JSON.stringify(r.name);if(r.type==="param")return`:${o}`;if(r.type==="wildcard")return`*${o}`;throw new TypeError(`Unexpected token: ${r}`)}).join("")}function Se(e){const[t,...r]=e;return J.test(t)?r.every(n=>D.test(n)):!1}function Ee(e){return(e==null?void 0:e.type)!=="text"?!0:!D.test(e.value[0])}const $e=Symbol("any"),Oe=Symbol("number"),je=Symbol("string"),Ae=Symbol("array"),E={any:$e,number:Oe,string:je,array:Ae};function z(e,t){for(const r of e)if(!t.includes(r))return!1;return!0}function B(e,t){for(const r in t){const n=t[r];if(Array.isArray(n)&&(!e[r]||JSON.stringify(n)!==e[r]))return!1;switch(typeof n){case"number":{if(!e[r]||n.toString()!==e[r])return!1;break}case"object":{if(!e[r]||JSON.stringify(n)!==e[r])return!1;break}case"string":{if(!e[r]||n!==e[r])return!1;break}case"boolean":{if(!e[r]||!["0","1","false","true"].includes(e[r]))return!1;break}}switch(n){case E.any:{if(!e[r])return!1;break}case E.string:{if(!e[r]||Array.isArray(e[r]))return!1;break}case E.array:{if(!e[r]||!Array.isArray(e[r]))return!1;break}case E.number:{if(!e[r]||Array.isArray(e[r])||isNaN(parseInt(e[r]))&&isNaN(parseFloat(e[r])))return!1;break}}}return!0}function Ne(e,t){const r={};for(const n in t){const a=t[n],s=e[n];if(Array.isArray(a)){r[n]=s==="1"||s==="true";continue}switch(typeof a){case"number":{const o=e[n];r[n]=isNaN(parseInt(o))?parseFloat(o):parseInt(o);break}case"object":{r[n]=JSON.parse(s);break}case"string":r[n]=e[n];case"boolean":{const o=e[n];r[n]=o==="0"?parseFloat(o):parseInt(o);break}}switch(a){case E.any:case E.string:case E.array:{r[n]=e[n];break}case E.number:{const o=e[n];r[n]=isNaN(parseInt(o))?parseFloat(o):parseInt(o);break}}}return r}function Re(e,t){return r=>{const{parameters:n,forRoutes:a}=r,s=c.createEvent({name:"entered",sid:"-d3obu6"}),o=c.createEvent({name:"exited",sid:"-xofyk3"}),i=c.createEvent({name:"exit",sid:"-673d76"});return c.sample({and:[{source:{activeRoutes:e,query:t},filter:u=>{let{activeRoutes:l,query:h}=u;return(!a||z(a,l))&&B(h,n)},fn:u=>{let{query:l}=u;return Ne(l,n)}}],or:{sid:"-so0f9q"}}),c.sample({and:[{source:{activeRoutes:e,query:t},filter:u=>{let{activeRoutes:l,query:h}=u;return!((!a||z(a,l))&&B(h,n))},target:o}],or:{sid:"-s82e29"}}),{entered:s,exited:o,exit:i,getPayload:u=>Object.entries(u).reduce((l,h)=>{let[p,w]=h;return typeof n[p]=="symbol"?l[p]=w:l[p]=n[p],l},{})}}}const G="%[a-f0-9]{2}",H=new RegExp("("+G+")|([^%]+?)","gi"),V=new RegExp("("+G+")+","gi");function P(e,t){try{return[decodeURIComponent(e.join(""))]}catch{}if(e.length===1)return e;t=t||1;const r=e.slice(0,t),n=e.slice(t);return Array.prototype.concat.call([],P(r),P(n))}function ve(e){try{return decodeURIComponent(e)}catch{let t=e.match(H)||[];for(let r=1;r<t.length;r++)e=P(t,r).join(""),t=e.match(H)||[];return e}}function Ie(e){const t={"%FE%FF":"��","%FF%FE":"��"};let r=V.exec(e);for(;r;){try{t[r[0]]=decodeURIComponent(r[0])}catch{const a=ve(r[0]);a!==r[0]&&(t[r[0]]=a)}r=V.exec(e)}t["%C2"]="�";const n=Object.keys(t);for(const a of n)e=e.replace(new RegExp(a,"g"),t[a]);return e}function Pe(e){if(typeof e!="string")throw new TypeError("Expected `encodedURI` to be of type `string`, got `"+typeof e+"`");try{return decodeURIComponent(e)}catch{return Ie(e)}}function ke(e,t){const r={};if(Array.isArray(t))for(const n of t){const a=Object.getOwnPropertyDescriptor(e,n);a!=null&&a.enumerable&&Object.defineProperty(r,n,a)}else for(const n of Reflect.ownKeys(e)){const a=Object.getOwnPropertyDescriptor(e,n);if(a.enumerable){const s=e[n];t(n,s,e)&&Object.defineProperty(r,n,a)}}return r}function X(e,t){if(!(typeof e=="string"&&typeof t=="string"))throw new TypeError("Expected the arguments to be of type `string`");if(e===""||t==="")return[];const r=e.indexOf(t);return r===-1?[]:[e.slice(0,r),e.slice(r+t.length)]}const Ce=e=>e==null,Te=e=>encodeURIComponent(e).replaceAll(/[!'()*]/g,t=>`%${t.charCodeAt(0).toString(16).toUpperCase()}`),k=Symbol("encodeFragmentIdentifier");function De(e){switch(e.arrayFormat){case"index":return t=>(r,n)=>{const a=r.length;return n===void 0||e.skipNull&&n===null||e.skipEmptyString&&n===""?r:n===null?[...r,[y(t,e),"[",a,"]"].join("")]:[...r,[y(t,e),"[",y(a,e),"]=",y(n,e)].join("")]};case"bracket":return t=>(r,n)=>n===void 0||e.skipNull&&n===null||e.skipEmptyString&&n===""?r:n===null?[...r,[y(t,e),"[]"].join("")]:[...r,[y(t,e),"[]=",y(n,e)].join("")];case"colon-list-separator":return t=>(r,n)=>n===void 0||e.skipNull&&n===null||e.skipEmptyString&&n===""?r:n===null?[...r,[y(t,e),":list="].join("")]:[...r,[y(t,e),":list=",y(n,e)].join("")];case"comma":case"separator":case"bracket-separator":{const t=e.arrayFormat==="bracket-separator"?"[]=":"=";return r=>(n,a)=>a===void 0||e.skipNull&&a===null||e.skipEmptyString&&a===""?n:(a=a===null?"":a,n.length===0?[[y(r,e),t,y(a,e)].join("")]:[[n,y(a,e)].join(e.arrayFormatSeparator)])}default:return t=>(r,n)=>n===void 0||e.skipNull&&n===null||e.skipEmptyString&&n===""?r:n===null?[...r,y(t,e)]:[...r,[y(t,e),"=",y(n,e)].join("")]}}function Ue(e){let t;switch(e.arrayFormat){case"index":return(r,n,a)=>{if(t=/\[(\d*)]$/.exec(r),r=r.replace(/\[\d*]$/,""),!t){a[r]=n;return}a[r]===void 0&&(a[r]={}),a[r][t[1]]=n};case"bracket":return(r,n,a)=>{if(t=/(\[])$/.exec(r),r=r.replace(/\[]$/,""),!t){a[r]=n;return}if(a[r]===void 0){a[r]=[n];return}a[r]=[...a[r],n]};case"colon-list-separator":return(r,n,a)=>{if(t=/(:list)$/.exec(r),r=r.replace(/:list$/,""),!t){a[r]=n;return}if(a[r]===void 0){a[r]=[n];return}a[r]=[...a[r],n]};case"comma":case"separator":return(r,n,a)=>{const s=typeof n=="string"&&n.includes(e.arrayFormatSeparator),o=typeof n=="string"&&!s&&S(n,e).includes(e.arrayFormatSeparator);n=o?S(n,e):n;const i=s||o?n.split(e.arrayFormatSeparator).map(u=>S(u,e)):n===null?n:S(n,e);a[r]=i};case"bracket-separator":return(r,n,a)=>{const s=/(\[])$/.test(r);if(r=r.replace(/\[]$/,""),!s){a[r]=n&&S(n,e);return}const o=n===null?[]:S(n,e).split(e.arrayFormatSeparator);if(a[r]===void 0){a[r]=o;return}a[r]=[...a[r],...o]};default:return(r,n,a)=>{if(a[r]===void 0){a[r]=n;return}a[r]=[...[a[r]].flat(),n]}}}function Y(e){if(typeof e!="string"||e.length!==1)throw new TypeError("arrayFormatSeparator must be single character string")}function y(e,t){return t.encode?t.strict?Te(e):encodeURIComponent(e):e}function S(e,t){return t.decode?Pe(e):e}function Z(e){return Array.isArray(e)?e.sort():typeof e=="object"?Z(Object.keys(e)).sort((t,r)=>Number(t)-Number(r)).map(t=>e[t]):e}function ee(e){const t=e.indexOf("#");return t!==-1&&(e=e.slice(0,t)),e}function _e(e){let t="";const r=e.indexOf("#");return r!==-1&&(t=e.slice(r)),t}function K(e,t,r){return r==="string"&&typeof e=="string"?e:typeof r=="function"&&typeof e=="string"?r(e):t.parseBooleans&&e!==null&&(e.toLowerCase()==="true"||e.toLowerCase()==="false")?e.toLowerCase()==="true":r==="number"&&!Number.isNaN(Number(e))&&typeof e=="string"&&e.trim()!==""||t.parseNumbers&&!Number.isNaN(Number(e))&&typeof e=="string"&&e.trim()!==""?Number(e):e}function _(e){e=ee(e);const t=e.indexOf("?");return t===-1?"":e.slice(t+1)}function q(e,t){t={decode:!0,sort:!0,arrayFormat:"none",arrayFormatSeparator:",",parseNumbers:!1,parseBooleans:!1,types:Object.create(null),...t},Y(t.arrayFormatSeparator);const r=Ue(t),n=Object.create(null);if(typeof e!="string"||(e=e.trim().replace(/^[?#&]/,""),!e))return n;for(const a of e.split("&")){if(a==="")continue;const s=t.decode?a.replaceAll("+"," "):a;let[o,i]=X(s,"=");o===void 0&&(o=s),i=i===void 0?null:["comma","separator","bracket-separator"].includes(t.arrayFormat)?i:S(i,t),r(S(o,t),i,n)}for(const[a,s]of Object.entries(n))if(typeof s=="object"&&s!==null&&t.types[a]!=="string")for(const[o,i]of Object.entries(s)){const u=t.types[a]?t.types[a].replace("[]",""):void 0;s[o]=K(i,t,u)}else typeof s=="object"&&s!==null&&t.types[a]==="string"?n[a]=Object.values(s).join(t.arrayFormatSeparator):n[a]=K(s,t,t.types[a]);return t.sort===!1?n:(t.sort===!0?Object.keys(n).sort():Object.keys(n).sort(t.sort)).reduce((a,s)=>{const o=n[s];return a[s]=o&&typeof o=="object"&&!Array.isArray(o)?Z(o):o,a},Object.create(null))}function re(e,t){if(!e)return"";t={encode:!0,strict:!0,arrayFormat:"none",arrayFormatSeparator:",",...t},Y(t.arrayFormatSeparator);const r=o=>t.skipNull&&Ce(e[o])||t.skipEmptyString&&e[o]==="",n=De(t),a={};for(const[o,i]of Object.entries(e))r(o)||(a[o]=i);const s=Object.keys(a);return t.sort!==!1&&s.sort(t.sort),s.map(o=>{const i=e[o];return i===void 0?"":i===null?y(o,t):Array.isArray(i)?i.length===0&&t.arrayFormat==="bracket-separator"?y(o,t)+"[]":i.reduce(n(o),[]).join("&"):y(o,t)+"="+y(i,t)}).filter(o=>o.length>0).join("&")}function te(e,t){var a;t={decode:!0,...t};let[r,n]=X(e,"#");return r===void 0&&(r=e),{url:((a=r==null?void 0:r.split("?"))==null?void 0:a[0])??"",query:q(_(e),t),...t&&t.parseFragmentIdentifier&&n?{fragmentIdentifier:S(n,t)}:{}}}function ne(e,t){t={encode:!0,strict:!0,[k]:!0,...t};const r=ee(e.url).split("?")[0]||"",n=_(e.url),a={...q(n,{sort:!1}),...e.query};let s=re(a,t);s&&(s=`?${s}`);let o=_e(e.url);if(typeof e.fragmentIdentifier=="string"){const i=new URL(r);i.hash=e.fragmentIdentifier,o=t[k]?i.hash:`#${e.fragmentIdentifier}`}return`${r}${s}${o}`}function ae(e,t,r){r={parseFragmentIdentifier:!0,[k]:!1,...r};const{url:n,query:a,fragmentIdentifier:s}=te(e,r);return ne({url:n,query:ke(a,t),fragmentIdentifier:s},r)}function qe(e,t,r){const n=Array.isArray(t)?a=>!t.includes(a):(a,s)=>!t(a,s);return ae(e,n,r)}const I=Object.freeze(Object.defineProperty({__proto__:null,exclude:qe,extract:_,parse:q,parseUrl:te,pick:ae,stringify:re,stringifyUrl:ne},Symbol.toStringTag,{value:"Module"}));function Me(e){const{base:t="/",routes:r}=e,n=c.createStore(null,{and:{serialize:"ignore"},name:"$history",sid:"ftu36z"}),a=c.createStore([],{and:{serialize:"ignore"},name:"$activeRoutes",sid:"z30ma4"}),s=c.createStore({},{name:"$query",sid:"hkri52"}),o=c.createStore(null,{name:"$path",sid:"-zgnqnj"}),i=c.createEvent({name:"setHistory",sid:"w6xvrg"}),u=c.createEvent({name:"back",sid:"-4mcm91"}),l=c.createEvent({name:"forward",sid:"6nmzsp"}),h=c.createEvent({name:"locationUpdated",sid:"qywvkp"}),p=r.map(d=>{let g=d;const f=[];for(f.unshift(g.internal.path);g.internal.parent;)g=g.internal.parent,g.internal.path!=="/"&&f.unshift(g.internal.path);const b=t==="/"?f.join(""):[t,...f].join("");return{route:d,path:b,toPath:ue(b),fromPath:le(b)}}),w=c.attach({and:{source:{history:n},effect:async(d,g)=>{let{history:f}=d,{path:b,query:R,replace:O}=g;if(!f)throw new Error("history not found");const M={pathname:b,search:"?".concat(I.stringify(R))};O?f.replace(M):f.push(M)}},or:{name:"navigateFx",sid:"qepxid"}}),x=c.createEffect(d=>{const g=c.scopeBind(h);if(g({pathname:d.location.pathname,query:I.parse(d.location.search)}),!d)throw new Error;d.listen(f=>{let{location:b}=f;g({pathname:b.pathname,query:I.parse(b.search)})})},{name:"subscribeHistoryFx",sid:"es8v7q"}),m=c.attach({and:{source:{query:s,path:o},effect:async d=>{let{query:g,path:f}=d;for(const{route:b,fromPath:R}of p){const O=R(f);if(O)await b.internal.openFx({query:g,params:O.params,historyIgnore:!0});else{b.internal.close();continue}}}},or:{name:"openRoutesByPathFx",sid:"bmwb4p"}});for(const{route:d,toPath:g}of p)c.sample({and:[{clock:d.opened,source:a,filter:f=>!f.includes(d),fn:f=>[...f,d],target:a}],or:{sid:"ff1m4n"}}),c.sample({and:[{clock:d.opened,filter:f=>!(f!=null&&f.historyIgnore),fn:f=>{var b;return{path:g(f&&"params"in f?f.params:void 0),query:(b=f==null?void 0:f.query)!==null&&b!==void 0?b:{},replace:f==null?void 0:f.replace}},target:w}],or:{sid:"fuznc4"}}),c.sample({and:[{clock:d.closed,source:a,fn:f=>f.filter(b=>b!==d),target:a}],or:{sid:"ges8p4"}});return c.sample({and:[{clock:i,target:n}],or:{sid:"guq9uv"}}),c.sample({and:[{clock:n,filter:Boolean,target:x}],or:{sid:"gxh8to"}}),c.sample({and:[{clock:h,fn:d=>{var g;return{path:d.pathname,query:(g=d.query)!==null&&g!==void 0?g:{}}},target:[c.withFactory({sid:"-38mmc2",fn:()=>se.spread({targets:{path:o,query:s}}),name:"target",method:"spread"}),m]}],or:{sid:"hcbouf"}}),{$query:s,$path:o,$activeRoutes:a,back:u,forward:l,routes:r,setHistory:i,mappedRoutes:p,trackQuery:Re(a,s),"@@unitShape":()=>({query:s,path:o,activeRoutes:a,onBack:u,onForward:l})}}exports.createRoute=fe;exports.createRouter=Me;exports.parameters=E;
package/dist/index.d.ts CHANGED
@@ -20,7 +20,7 @@ declare interface Config<T> {
20
20
  beforeOpen?: Effect<void, any, any>[];
21
21
  }
22
22
 
23
- export declare function createRoute<T extends string, Params = ParseUrlParams<T>>(config: Config<T>): Route<Params>;
23
+ export declare function createRoute<T extends string, Params = SafeParams<ParseUrlParams<T>>>(config: Config<T>): Route<Params>;
24
24
 
25
25
  export declare function createRouter(config: RouterConfig): Router;
26
26
 
@@ -37,7 +37,12 @@ declare type Parameters_2 = {
37
37
  array: ArrayParameter;
38
38
  };
39
39
 
40
- export declare type Query = Record<string, string | string[]>;
40
+ declare type PayloadBase = {
41
+ query?: Query;
42
+ replace?: boolean;
43
+ };
44
+
45
+ export declare type Query = Record<string, string | null | Array<string | null>>;
41
46
 
42
47
  declare interface QueryTracker<ParametersConfig extends RawConfig> {
43
48
  entered: Event_2<ReadyConfig<ParametersConfig>>;
@@ -76,11 +81,9 @@ export declare interface Route<T> {
76
81
  };
77
82
  }
78
83
 
79
- declare type RouteOpenedPayload<T> = {
84
+ export declare type RouteOpenedPayload<T> = T extends void ? undefined | PayloadBase : {
80
85
  params: T;
81
- query?: Record<string, any>;
82
- replace?: boolean;
83
- };
86
+ } & PayloadBase;
84
87
 
85
88
  export declare interface Router {
86
89
  $query: Store<Query>;
@@ -111,6 +114,8 @@ declare interface RouterConfig {
111
114
  routes: Route<any>[];
112
115
  }
113
116
 
117
+ declare type SafeParams<T> = T extends Record<string, never> ? void : T;
118
+
114
119
  declare type StringParameter = typeof stringSymbol;
115
120
 
116
121
  declare const stringSymbol: unique symbol;