@argon-router/core 0.11.0 → 0.12.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 e=require("effector"),a=require("query-string"),n=require("patronum");function t(e,a){for(const n of e)if(a.includes(n))return!0;return!1}function r(a){let{$query:n,navigate:t}=a;return o({$activeRoutes:e.createStore([],{name:"$activeRoutes",sid:"ni3bf8"}),$query:n,navigate:t})}function o(a){let{$activeRoutes:n,$query:r,navigate:o}=a;return a=>{const{parameters:s,forRoutes:i}=a,c=e.createStore(!1,{name:"$entered",sid:"-i5493b"}),d=e.createEvent({name:"entered",sid:"9i8bun"}),l=e.createEvent({name:"exited",sid:"-p2hcsy"}),p=e.createEvent({name:"enter",sid:"30cmky"}),u=e.createEvent({name:"exit",sid:"-2657ec"}),m=e.createEvent({name:"changeEntered",sid:"-5jm7r1"});return e.sample({and:[{clock:m,target:c}],or:{sid:"-j6nk9y"}}),e.sample({and:[{source:{activeRoutes:n,query:r},filter:e=>{let{activeRoutes:a,query:n}=e;return(!i||t(i,a))&&s.safeParse(n).success},fn:e=>{let{query:a}=e;return s.safeParse(a).data},target:[d,m.prepend(()=>!0)]}],or:{sid:"-iscwuk"}}),e.sample({and:[{source:{activeRoutes:n,query:r,entered:c},filter:e=>{let{activeRoutes:a,query:n,entered:r}=e;return r&&!((!i||t(i,a))&&s.safeParse(n).success)},target:[l.prepend(()=>{}),m.prepend(()=>!1)]}],or:{sid:"-ibv31q"}}),e.sample({and:[{clock:p,source:r,fn:(e,a)=>({query:{...e,...a}}),target:o}],or:{sid:"-hsmaa3"}}),e.sample({and:[{clock:u,source:r,fn:(e,a)=>{if(a&&a.ignoreParams){const n={};for(const t of a.ignoreParams)e[t]&&(n[t]=e[t]);return{query:n}}return{query:{}}},target:o}],or:{sid:"-whgzm0"}}),{enter:p,entered:d,exited:l,exit:u}}}function s(e){return a=>{const n=a.split("/").map(e=>e.trim()).filter(e=>""!==e);let t=null;function r(e,a){t||(t={}),t[e]=a}if(0===e.length)return 0===n.length?{path:a,params:null}:null;for(let o=0;o<e.length;o++){const a=e[o];switch(a.type){case"const":if(a.name!==n.shift())return null;continue;case"parameter":{const{arrayProps:t,genericProps:s,required:i}=a.payload;if(t){const i=[];let c;for(;c=n.shift(),c;){switch(null==s?void 0:s.type){case"number":if(isNaN(+c))return null;i.push(+c);break;case"union":if(!s.items.includes(c))return null;i.push(c);break;default:i.push(c)}if(i.length>=(t.max??1/0))break}if(i.length<(t.min??0))return null;if(n.length>0&&!e[o+1])return null;r(a.name,i);break}const c=n.shift();if(i&&!c)return null;if(!c){r(a.name,void 0);continue}switch(null==s?void 0:s.type){case"number":if(isNaN(+c))return null;r(a.name,+c);break;case"union":if(!s.items.includes(c))return null;r(a.name,c);break;default:r(a.name,c)}}}}return n.length>0?null:{path:a,params:t}}}function i(e){if(!e)return null;const a=e[1];let n,t,r;for(const o of e.slice(2))o&&(o.includes("<")?n=o.replaceAll(/\s/g,"").replace("<","").replace(">",""):(o.includes("{")&&(t=o.replace("{","").replace("}","").split(",").map(e=>parseInt(e))),["*","?","+"].includes(o)&&(r=o)));return{name:a,genericProps:n,arrayProps:t,modificator:r}}function c(e){return a=>{const n=[];if(0===e.length)return"/";for(const t of e)switch(t.type){case"const":n.push(t.name);break;case"parameter":if(!a[t.name])continue;if(Array.isArray(a[t.name]))for(const e of a[t.name])n.push(e.toString());else n.push(a[t.name].toString())}return`/${n.join("/")}`}}function d(){const n=e.createStore(null,{and:{serialize:"ignore"},name:"$history",sid:"-ld7lzl"}),t=e.createStore({query:{},path:null},{name:"$locationState",sid:"-4u3w85"}),o=t.map(e=>e.query),s=t.map(e=>e.path),i=e.createEvent({name:"setHistory",sid:"-ormmkk"}),c=e.createEvent({name:"navigate",sid:"tawqep"}),d=e.createEvent({name:"back",sid:"bxy8rt"}),l=e.createEvent({name:"forward",sid:"-bpmzb1"}),p=e.createEvent({name:"locationUpdated",sid:"lkzldx"}),u=e.attach({and:{source:n,effect:(e,n)=>{let{path:t,query:r,replace:o}=n;if(!e)throw new Error("history not found");const s={pathname:t,search:`?${a.stringify(r)}`};o?e.replace(s):e.push(s)}},or:{name:"navigateFx",sid:"-ov1xn7"}}),m=e.createEffect(n=>{const t=e.scopeBind(p);if(t({pathname:n.location.pathname,query:{...a.parse(n.location.search)}}),!n)throw new Error;n.listen(e=>{let{location:n}=e;t({pathname:n.pathname,query:{...a.parse(n.search)}})})},{name:"subscribeHistoryFx",sid:"-m60vds"});return e.sample({and:[{clock:i,target:n}],or:{sid:"ii4q"}}),e.sample({and:[{clock:n,filter:Boolean,target:m}],or:{sid:"39h3j"}}),e.sample({and:[{clock:p,fn:e=>({path:e.pathname,query:e.query}),target:t}],or:{sid:"i3x4a"}}),e.sample({and:[{clock:c,source:s,fn:(e,a)=>({path:e,...a}),target:u}],or:{sid:"ylqx4"}}),{$history:n,$locationState:t,$query:o,$path:s,setHistory:i,navigate:c,back:d,forward:l,locationUpdated:p,trackQuery:r({$query:o,navigate:c})}}function l(){let a=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};const{beforeOpen:n,$isPending:t=e.createStore(!1,{name:"$isPending",sid:"-f18bwu"}),transformer:r=e=>e??null}=a,o=e.createStore(null,{name:"$params",sid:"v2ropa"}),s=e.createStore(!1,{name:"$isOpened",sid:"mzzqqr"}),i=e.createEvent({name:"open",sid:"f33vnd"}),c=e.createEvent({name:"opened",sid:"-efpvez"}),d=e.createEvent({name:"openedOnServer",sid:"o8st20"}),l=e.createEvent({name:"openedOnClient",sid:"xaagqn"}),p=e.createEvent({name:"close",sid:"-20upkw"}),u=e.createEvent({name:"closed",sid:"avevxu"}),m=e.createEvent({name:"cancelled",sid:"808tq5"});return e.sample({and:[{clock:i,target:[c]}],or:{sid:"p3r2ad"}}),e.sample({and:[{clock:i,fn:r,target:o}],or:{sid:"p6i196"}}),e.split({and:[{source:c,match:()=>"undefined"==typeof window?"server":"client",cases:{server:d,client:l}}],or:{sid:"plch9x"}}),e.sample({and:[{clock:p,target:u}],or:{sid:"q1ub2r"}}),e.sample({and:[{clock:[c.map(()=>!0),u.map(()=>!1)],target:s}],or:{sid:"q4la1k"}}),{$params:o,$isOpened:s,$isPending:t,open:i,opened:c,openedOnClient:l,openedOnServer:d,close:p,closed:u,cancelled:m,path:"",beforeOpen:n,"@@unitShape":()=>({params:o,isOpened:s,isPending:t,onOpen:i,onClose:p})}}exports.chainRoute=function(a){const{route:n,beforeOpen:t,openOn:r,cancelOn:o}=a;let s;const i=e.createEffect(()=>null==s?void 0:s(),{name:"waitForAsyncBundleFx",sid:"qdkcuo"}),c=e.createEffect(async e=>{await i();for(const a of[].concat(t))await a(e)},{name:"openFx",sid:"-fwntqy"}),d=e=>e&&"params"in e?e.params:null,p=l({transformer:d});return e.sample({and:[{clock:n.opened,target:c}],or:{sid:"-s9xf6p"}}),e.sample({and:[{clock:n.opened,fn:d,target:p.$params}],or:{sid:"-1u78yc"}}),r&&e.sample({and:[{clock:r,source:p.$params,fn:e=>e,target:p.open}],or:{sid:"-1qcor3"}}),o&&(e.sample({and:[{clock:[n.closed].concat(o),target:p.close}],or:{sid:"-19uuy9"}}),e.sample({and:[{clock:[].concat(o),target:p.cancelled}],or:{sid:"-vk7iv"}})),Object.assign(p,{internal:{setAsyncImport:e=>s=e}})},exports.createRoute=function(a){let n;const t=e.createEffect(async e=>{await f(),await y();const n=a.parent;return n&&await n.internal.openFx({...e??{params:{}},navigate:!1}),e},{name:"openFx",sid:"awhgwd"}),r=e.createStore({},{name:"$params",sid:"-oahffx"}),o=e.createStore(!1,{name:"$isOpened",sid:"-6l68oe"}),s=t.pending,i=e.createEvent({name:"open",sid:"gjsrgc"}),c=e.createEvent({name:"close",sid:"-yagmc8"}),d=e.createEvent({name:"opened",sid:"x0iwhi"}),l=e.createEvent({name:"openedOnServer",sid:"346r3u"}),p=e.createEvent({name:"openedOnClient",sid:"31q95t"}),u=e.createEvent({name:"navigated",sid:"-t30l0x"}),m=e.createEvent({name:"closed",sid:"uue4ce"}),f=e.createEffect(()=>null==n?void 0:n(),{name:"waitForAsyncBundleFx",sid:"-nml5ho"}),y=e.createEffect(async()=>{for(const e of a.beforeOpen??[])await e()},{name:"beforeOpenFx",sid:"-vqlnbm"}),h=e.attach({and:{effect:t},or:{name:"navigatedFx",sid:"a4yadj"}}),g={};return e.sample({and:[{clock:i,target:t}],or:{sid:"ynxuww"}}),e.sample({and:[{clock:u,fn:e=>({navigate:!1,...e}),target:h}],or:{sid:"z28ica"}}),e.sample({and:[{clock:h.doneData,fn:e=>e&&"params"in e?{...e.params}:g,target:r}],or:{sid:"z5j9wg"}}),e.sample({and:[{clock:h.failData,fn:()=>g,target:r}],or:{sid:"-z1vw16"}}),e.split({and:[{source:h.doneData,match:()=>"undefined"==typeof window?"server":"client",cases:{server:l,client:p}}],or:{sid:"-yyl4h0"}}),e.sample({and:[{clock:[p,l],target:d}],or:{sid:"-yhji2t"}}),e.sample({and:[{clock:c,target:m}],or:{sid:"-y38unf"}}),e.sample({and:[{clock:[d.map(()=>!0),m.map(()=>!1)],target:o}],or:{sid:"-y0hvom"}}),{$params:r,$isOpened:o,$isPending:s,open:i,closed:m,opened:d,openedOnClient:p,openedOnServer:l,...a,internal:{navigated:u,close:c,openFx:t,setAsyncImport:e=>n=e},"@@unitShape":()=>({params:r,isPending:s,isOpened:o,onOpen:i})}},exports.createRouter=function(a){const{base:n="/",routes:t}=a,{$path:r,$query:l,back:p,forward:u,navigate:m,setHistory:f,locationUpdated:y}=d(),h=t.map(e=>{let a=e;const t=[];for(t.unshift(a.path);a.parent;)a=a.parent,"/"!==a.path&&t.unshift(a.path);const r="/"===n?t.join(""):[n,...t].join(""),{build:o,parse:d}=function(e){const a=[],n=/:(\w+)(<[\s?\w|]+>)?({\d+\,\d+})?([+*?])?/,t=e.split("/").filter(Boolean);for(let r=0;r<t.length;r++){const o=t[r];if(!o)continue;const s=i(o.match(n));if(!s){a.push({type:"const",name:o,payload:void 0});continue}const{arrayProps:c,genericProps:d,modificator:l,name:p}=s;if(!p)throw new Error(`Invalid path: "${e}". Name for argument must be provided`);const u={type:"parameter",name:p,payload:{required:!0}};switch(d&&"number"===d&&(u.payload.genericProps={type:"number"}),d&&d.includes("|")&&(u.payload.genericProps={type:"union",items:d.split("|")}),l){case"*":u.payload.arrayProps={};break;case"+":u.payload.arrayProps={min:1};break;case"?":u.payload.required=!1}c&&(u.payload.arrayProps={...u.payload.arrayProps,min:c[0],max:c[1]}),a.push(u)}return{parse:s(a),build:c(a)}}(r);return{route:e,path:r,build:o,parse:d}}),g=r.map(e=>{const a=[];if(!e)return a;for(const{route:n,parse:t}of h)t(e)&&a.push(n);return a}),v=e.attach({and:{source:{query:l,path:r},effect:async a=>{let{query:n,path:t}=a;for(const{route:r,parse:o}of h){const a=o(t),[s,i]=[e.scopeBind(r.internal.close),e.scopeBind(r.internal.navigated)];a?i({query:n,params:a.params}):s()}}},or:{name:"openRoutesByPathFx",sid:"-3zl7vq"}});for(const{route:o,build:s}of h)e.sample({and:[{clock:o.internal.openFx.doneData,filter:e=>!1!==(null==e?void 0:e.navigate),fn:e=>({path:s(e&&"params"in e?e.params:void 0),query:(null==e?void 0:e.query)??{},replace:null==e?void 0:e.replace}),target:m}],or:{sid:"exzzqg"}});return e.sample({and:[{clock:y,fn:e=>({path:e.pathname,query:e.query}),target:v}],or:{sid:"ficdn3"}}),{$query:l,$path:r,$activeRoutes:g,back:p,forward:u,navigate:m,routes:t,setHistory:f,mappedRoutes:h,trackQuery:o({$activeRoutes:g,$query:l,navigate:m}),"@@unitShape":()=>({query:l,path:r,activeRoutes:g,onBack:p,onForward:u,onNavigate:m})}},exports.createRouterControls=d,exports.createVirtualRoute=l,exports.group=function(a){const t=l({$isPending:e.withFactory({sid:"-u1putn",fn:()=>n.or(...a.map(e=>e.$isPending)),name:"$isPending",method:"or"})});return e.sample({and:[{clock:a.map(e=>e.$isOpened),filter:e.withFactory({sid:"76kf3k",fn:()=>n.or(...a.map(e=>e.$isOpened)),name:"filter",method:"or"}),fn:()=>{},target:t.open}],or:{sid:"-xmoke0"}}),e.sample({and:[{clock:a.map(e=>e.$isOpened),filter:e.withFactory({sid:"ahvrux",fn:()=>n.not(e.withFactory({sid:"xs5yb9",fn:()=>n.or(...a.map(e=>e.$isOpened)),name:"fn",method:"or"})),name:"filter",method:"not"}),fn:()=>{},target:t.close}],or:{sid:"-x7abrw"}}),t};
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("effector"),t=require("effector-action"),a=require("@argon-router/paths"),n=require("query-string"),r=require("patronum");function o(e,t){for(const a of e)if(t.includes(a))return!0;return!1}function s(t){let{$query:a,navigate:n}=t;return c({$activeRoutes:e.createStore([],{name:"$activeRoutes",sid:"og6k7m"}),$query:a,navigate:n})}function c(t){let{$activeRoutes:a,$query:n,navigate:r}=t;return t=>{const{parameters:s,forRoutes:c}=t,i=e.createStore(!1,{name:"$entered",sid:"-792y0u"}),p=e.createEvent({name:"entered",sid:"agbkn1"}),d=e.createEvent({name:"exited",sid:"-o4e40k"}),u=e.createEvent({name:"enter",sid:"3yfvdc"}),l=e.createEvent({name:"exit",sid:"-181yly"}),m=e.createEvent({name:"changeEntered",sid:"-4liyyn"});return e.sample({and:[{clock:m,target:i}],or:{sid:"-iu0amn"}}),e.sample({and:[{source:{activeRoutes:a,query:n},filter:e=>{let{activeRoutes:t,query:a}=e;return(!c||o(c,t))&&s.safeParse(a).success},fn:e=>{let{query:t}=e;return s.safeParse(t).data},target:[p,m.prepend(()=>!0)]}],or:{sid:"-ir9bnu"}}),e.sample({and:[{source:{activeRoutes:a,query:n,entered:i},filter:e=>{let{activeRoutes:t,query:a,entered:n}=e;return n&&!((!c||o(c,t))&&s.safeParse(a).success)},target:[d.prepend(()=>{}),m.prepend(()=>!1)]}],or:{sid:"-iarhv0"}}),e.sample({and:[{clock:u,source:n,fn:(e,t)=>({query:{...e,...t}}),target:r}],or:{sid:"-hqywi0"}}),e.sample({and:[{clock:l,source:n,fn:(e,t)=>{if(t&&t.ignoreParams){const a={};for(const n of t.ignoreParams)e[n]&&(a[n]=e[n]);return{query:a}}return{query:{}}},target:r}],or:{sid:"-wf9t8k"}}),{enter:u,entered:p,exited:d,exit:l}}}function i(){const a=e.createStore(null,{and:{serialize:"ignore"},name:"$history",sid:"-kw5zle"}),r=e.createStore({query:{},path:null},{name:"$locationState",sid:"-2xxend"}),o=e.createStore(null,{name:"$subscription",sid:"27a2zr"}),c=r.map(e=>e.query),i=r.map(e=>e.path),p=e.createEvent({name:"setHistory",sid:"-lxcw7e"}),d=e.createEvent({name:"navigate",sid:"w56grv"}),u=e.createEvent({name:"back",sid:"es7z4z"}),l=e.createEvent({name:"forward",sid:"12ktc8"}),m=e.createEvent({name:"locationUpdated",sid:"yd7e16"}),f=e.attach({and:{source:a,effect:(e,t)=>{let{path:a,query:r,replace:o}=t;if(!e)throw new Error("history not found");const s={pathname:a,search:`?${n.stringify(r)}`};o?e.replace(s):e.push(s)}},or:{name:"navigateFx",sid:"-m0s7a1"}}),h=t.createAsyncAction({target:{locationUpdated:m,$subscription:o},source:{$subscription:o},fn:async(e,t,a)=>{if(!a)throw Error("Cannot initialize router controls with empty history adapter. Please provide some provider or check your code for passing of nullable value");const r=await t();r.subscription&&r.subscription.unsubscribe(),e.locationUpdated({pathname:a.location.pathname,query:{...n.parse(a.location.search)}}),e.$subscription(a.listen(t=>{e.locationUpdated({pathname:t.pathname,query:{...n.parse(t.search)}})}))}}),g=e.attach({and:{source:a,effect:e=>{if(!e)throw new Error("history not found");e.goBack()}},or:{name:"goBackFx",sid:"k3gxue"}}),y=e.attach({and:{source:a,effect:e=>{if(!e)throw new Error("history not found");e.goForward()}},or:{name:"goForwardFx",sid:"1m1c40"}});return e.sample({and:[{clock:p,target:a}],or:{sid:"1ycdhl"}}),e.sample({and:[{clock:a,filter:Boolean,target:h}],or:{sid:"213cge"}}),e.sample({and:[{clock:m,fn:e=>({path:e.pathname,query:e.query}),target:r}],or:{sid:"2fxsh5"}}),e.sample({and:[{clock:d,source:i,fn:(e,t)=>({path:e,...t}),target:f}],or:{sid:"2wfm9z"}}),e.sample({and:[{clock:u,target:g}],or:{sid:"3btuw3"}}),e.sample({and:[{clock:l,target:y}],or:{sid:"3ektuw"}}),{$history:a,$locationState:r,$query:c,$path:i,setHistory:p,navigate:d,back:u,forward:l,locationUpdated:m,trackQuery:s({$query:c,navigate:d})}}const p={route:e=>p.pathRoute(e)||p.pathlessRoute(e),pathRoute:e=>"object"==typeof e&&null!==e&&"@@type"in e&&"path-route"===e["@@type"],pathlessRoute:e=>"object"==typeof e&&null!==e&&"@@type"in e&&"pathless-route"===e["@@type"],router:e=>"object"==typeof e&&null!==e&&"@@type"in e&&"router"===e["@@type"]},d={pathlessRoute:e=>"route"in e,pathRoute(e){return!this.pathlessRoute(e)&&!this.router(e)},router:e=>p.router(e)};function u(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};const{beforeOpen:a,$isPending:n=e.createStore(!1,{name:"$isPending",sid:"-f18bwu"}),transformer:r=e=>e??null}=t,o=e.createStore(null,{name:"$params",sid:"v2ropa"}),s=e.createStore(!1,{name:"$isOpened",sid:"mzzqqr"}),c=e.createEvent({name:"open",sid:"f33vnd"}),i=e.createEvent({name:"opened",sid:"-efpvez"}),p=e.createEvent({name:"openedOnServer",sid:"o8st20"}),d=e.createEvent({name:"openedOnClient",sid:"xaagqn"}),u=e.createEvent({name:"close",sid:"-20upkw"}),l=e.createEvent({name:"closed",sid:"avevxu"}),m=e.createEvent({name:"cancelled",sid:"808tq5"});return e.sample({and:[{clock:c,target:[i]}],or:{sid:"p3r2ad"}}),e.sample({and:[{clock:c,fn:r,target:o}],or:{sid:"p6i196"}}),e.split({and:[{source:i,match:()=>"undefined"==typeof window?"server":"client",cases:{server:p,client:d}}],or:{sid:"plch9x"}}),e.sample({and:[{clock:u,target:l}],or:{sid:"q1ub2r"}}),e.sample({and:[{clock:[i.map(()=>!0),l.map(()=>!1)],target:s}],or:{sid:"q4la1k"}}),{"@@type":"pathless-route",$params:o,$isOpened:s,$isPending:n,open:c,opened:i,openedOnClient:d,openedOnServer:p,close:u,closed:l,cancelled:m,path:"",beforeOpen:a,"@@unitShape":()=>({params:o,isOpened:s,isPending:n,onOpen:c,onClose:u})}}function l(e){const t=new URL(decodeURIComponent(e.search));return{pathname:t.pathname,search:t.search,hash:t.hash}}exports.chainRoute=function(t){const{route:a,beforeOpen:n,openOn:r,cancelOn:o}=t;let s;const c=e.createEffect(()=>null==s?void 0:s(),{name:"waitForAsyncBundleFx",sid:"t7u37u"}),i=e.createEffect(async e=>{await c();for(const t of[].concat(n))await t(e)},{name:"openFx",sid:"-34g13p"}),p=e=>e&&"params"in e?e.params:{},d=u({transformer:p});return e.sample({and:[{clock:a.opened,target:i}],or:{sid:"-1tngcz"}}),e.sample({and:[{clock:a.opened,fn:p,target:d.$params}],or:{sid:"-1qwhe6"}}),r&&e.sample({and:[{clock:r,source:d.$params,fn:e=>({params:e}),target:d.open}],or:{sid:"-1bi8qc"}}),o&&(e.sample({and:[{clock:[a.closed].concat(o),target:d.close}],or:{sid:"-v0exi"}}),e.sample({and:[{clock:[].concat(o),target:d.cancelled}],or:{sid:"-s9fyp"}})),Object.assign(d,{internal:{setAsyncImport:e=>s=e}})},exports.createRoute=function(){let a,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};const r=n.beforeOpen??[],o=e.createEffect(async e=>{await v(),await k();const t=n.parent;return t&&await t.internal.openFx({...e??{params:{}},navigate:!1}),e},{name:"openFx",sid:"sf5hhk"}),s=e.createEffect(async e=>{const t=n.parent;return t&&await t.internal.forceOpenParentFx({...e??{params:{}},navigate:!1}),e},{name:"forceOpenParentFx",sid:"acd7wj"}),c=e.attach({and:{effect:o},or:{name:"navigatedFx",sid:"ci6eci"}}),i=e.createStore({},{name:"$params",sid:"p3bnh9"}),p=e.createStore(!1,{name:"$isOpened",sid:"o5kkev"}),d=o.pending,u=e.createEvent({name:"open",sid:"-bhgc3p"}),l=e.createEvent({name:"close",sid:"vypd6z"}),m=e.createEvent({name:"opened",sid:"-uyucke"}),f=e.createEvent({name:"openedOnServer",sid:"mewjoi"}),h=e.createEvent({name:"openedOnClient",sid:"63cfjt"}),g=e.createEvent({name:"navigated",sid:"mycajg"}),y=e.createEvent({name:"closed",sid:"5idv7d"}),v=e.createEffect(()=>null==a?void 0:a(),{name:"waitForAsyncBundleFx",sid:"-6s0q41"}),k=e.createEffect(async()=>{for(const e of r)await e()},{name:"beforeOpenFx",sid:"7f9gfq"}),w={};return e.sample({and:[{clock:u,target:o}],or:{sid:"-yxhjaa"}}),e.sample({and:[{clock:g,fn:e=>({navigate:!1,...e}),target:c}],or:{sid:"-yj6vuw"}}),e.sample({and:[{clock:c.done,fn:e=>{let{params:t}=e;return t},target:s}],or:{sid:"-yfw4aq"}}),t.createAction({clock:[c.doneData,s.doneData],target:{$params:i},fn:(e,t)=>t?e.$params("params"in t?{...t.params}:w):e.$params(w)}),e.sample({and:[{clock:c.failData,fn:()=>w,target:i}],or:{sid:"-xhsvic"}}),t.createAction({clock:[c.doneData,s.doneData],target:{openedOnServer:f,openedOnClient:h},fn:(e,t)=>"undefined"==typeof window?e.openedOnServer(t):e.openedOnClient(t)}),e.sample({and:[{clock:[h,f],target:m}],or:{sid:"-w72d2n"}}),e.sample({and:[{clock:l,target:y}],or:{sid:"-w4be3u"}}),e.sample({and:[{clock:[m.map(()=>!0),y.map(()=>!1)],target:p}],or:{sid:"-ls2oed"}}),{$params:i,$isOpened:p,$isPending:d,open:u,closed:y,opened:m,openedOnClient:h,openedOnServer:f,...n,internal:{navigated:g,close:l,openFx:o,forceOpenParentFx:s,setAsyncImport:e=>a=e},"@@unitShape":()=>({params:i,isPending:d,isOpened:p,onOpen:u})}},exports.createRouter=function(n){const{base:r="/",routes:o}=n,{$path:s,$query:u,$history:l,back:m,forward:f,navigate:h,setHistory:g,locationUpdated:y}=n.controls??i();function v(e){return"/"===r?e:"/"===e?r:`${r}${e}`}const k=e.createEvent({name:"connectToParentRouter",sid:"t0jaae"});let w=null;const $=[];function b(t){if(d.pathlessRoute(t)){const{build:e,parse:n}=a.compile(v(t.path));return{route:t.route,path:t.path,build:e,parse:n}}if(d.router(t))return e.sample({and:[{clock:g,target:t.setHistory}],or:{sid:"ez3kyw"}}),null;let n=t;const r=[];for(r.unshift(n.path);n.parent&&!p.pathlessRoute(n.parent);)n=n.parent,"/"!==n.path&&r.unshift(n.path);const o=v(r.join("")),{build:s,parse:c}=a.compile(o);return{route:t,path:o,build:s,parse:c}}const q=o.reduce((e,t)=>{const a=b(t);return a&&($.push(a),e.push(a)),d.router(t)&&$.push(...t.knownRoutes),e},[]),x=s.map(e=>{const t=[];if(!e)return t;for(const{route:a,parse:n}of q)n(e)&&t.push(a);return t}),R=e.attach({and:{source:{query:u,path:s},effect:async t=>{let{query:a,path:n}=t;for(const{route:r,parse:o}of q){const t=o(n),[s,c]=[e.scopeBind(r.internal.close),e.scopeBind(r.internal.navigated)];t?c({query:a,params:t.params}):s()}}},or:{name:"openRoutesByPathFx",sid:"-bl0nuq"}});function O(e){let{route:a,build:n}=e;t.createAction({clock:a.internal.openFx.doneData,target:{navigate:h},fn:(e,t)=>{if(!1===(null==t?void 0:t.navigate))return;const a={path:n(t&&"params"in t?t.params:void 0),query:(null==t?void 0:t.query)??{},replace:null==t?void 0:t.replace};return e.navigate(a)}})}for(const e of q)O(e);return e.sample({and:[{clock:y,fn:e=>({path:e.pathname,query:e.query}),target:R}],or:{sid:"ukhip5"}}),{"@@type":"router",$query:u,$path:s,$history:l,$activeRoutes:x,back:m,forward:f,navigate:h,setHistory:g,ownRoutes:q,knownRoutes:$,internal:{connectToParentRouter:k,get parent(){return w},set parent(e){w=e},base:r},trackQuery:c({$activeRoutes:x,$query:u,navigate:h}),registerRoute:e=>{const t=b(e);t&&($.push(t),q.push(t),O(t)),d.router(e)&&$.push(...e.knownRoutes)},"@@unitShape":()=>({query:u,path:s,activeRoutes:x,onBack:m,onForward:f,onNavigate:h})}},exports.createRouterControls=i,exports.createVirtualRoute=u,exports.group=function(t){const a=u({$isPending:e.withFactory({sid:"-u1putn",fn:()=>r.or(...t.map(e=>e.$isPending)),name:"$isPending",method:"or"})});return e.sample({and:[{clock:t.map(e=>e.$isOpened),filter:e.withFactory({sid:"76kf3k",fn:()=>r.or(...t.map(e=>e.$isOpened)),name:"filter",method:"or"}),fn:()=>{},target:a.open}],or:{sid:"-xmoke0"}}),e.sample({and:[{clock:t.map(e=>e.$isOpened),filter:e.withFactory({sid:"ahvrux",fn:()=>r.not(e.withFactory({sid:"xs5yb9",fn:()=>r.or(...t.map(e=>e.$isOpened)),name:"fn",method:"or"})),name:"filter",method:"not"}),fn:()=>{},target:a.close}],or:{sid:"-x7abrw"}}),a},exports.historyAdapter=function(e){return{location:e.location,push:e.push.bind(e),replace:e.replace.bind(e),goBack:e.back.bind(e),goForward:e.forward.bind(e),listen:t=>{const a=e.listen(e=>{let{location:a}=e;return t(a)});return Object.assign(a,{unsubscribe:a})}}},exports.is=p,exports.queryAdapter=function(e){return{location:l(e.location),push:t=>{if("string"==typeof t){const a=new URL(e.location.pathname);a.search=t,e.push(a.toString())}else{const a=new URL(e.location.pathname);a.search=`${t.pathname??""}${t.search??""}${t.hash??""}`,e.push(a.toString())}},replace:t=>{if("string"==typeof t){const a=new URL(e.location.pathname);a.search=t,e.replace(a.toString())}else{const a=new URL(e.location.pathname);a.search=`${t.pathname??""}${t.search??""}${t.hash??""}`,e.replace(a.toString())}},goBack:()=>{e.back()},goForward:()=>{e.forward()},listen:t=>{const a=e.listen(e=>{let{location:a}=e;return t(l(a))});return Object.assign(a,{unsubscribe:a})}}};
package/dist/index.d.ts CHANGED
@@ -7,12 +7,17 @@ import { Parser } from '@argon-router/paths';
7
7
  import { ParseUrlParams } from '@argon-router/paths';
8
8
  import { Store } from 'effector';
9
9
  import { StoreWritable } from 'effector';
10
+ import { Subscription } from 'effector';
10
11
  import { Unit } from 'effector';
11
12
  import { ValidatePath } from '@argon-router/paths';
12
- import { z } from 'zod';
13
- import { ZodType } from 'zod';
13
+ import { z } from 'zod/v4';
14
+ import { ZodType } from 'zod/v4';
14
15
 
15
- declare type BeforeOpenUnit<T> = (T extends void ? EventCallable<void> | EventCallable<OpenPayloadBase> : EventCallable<{
16
+ declare type AsyncBundleImport = () => Promise<{
17
+ default: any;
18
+ }>;
19
+
20
+ declare type BeforeOpenUnit<T extends object | void = void> = (T extends void ? EventCallable<void> | EventCallable<OpenPayloadBase> : EventCallable<{
16
21
  params: T;
17
22
  } & OpenPayloadBase>) | Effect<RouteOpenedPayload<T>, any>;
18
23
 
@@ -57,9 +62,9 @@ declare type BeforeOpenUnit<T> = (T extends void ? EventCallable<void> | EventCa
57
62
  * const postLoadedRoute = chainRoute({ route: authorizedRoute, ... });
58
63
  * ```
59
64
  */
60
- export declare function chainRoute<T>(props: ChainRouteProps<T>): VirtualRoute<RouteOpenedPayload<T>, T>;
65
+ export declare function chainRoute<T extends object | void = void>(props: ChainRouteProps<T>): VirtualRoute<RouteOpenedPayload<T>, T>;
61
66
 
62
- declare interface ChainRouteProps<T> {
67
+ declare interface ChainRouteProps<T extends object | void = void> {
63
68
  route: Route<T>;
64
69
  beforeOpen: BeforeOpenUnit<T> | BeforeOpenUnit<T>[];
65
70
  openOn?: Unit<any> | Unit<any>[];
@@ -91,17 +96,17 @@ declare interface ChainRouteProps<T> {
91
96
  * posts.open(); // profile.$isOpened -> true, posts.$isOpened -> true
92
97
  * ```
93
98
  */
94
- export declare function createRoute<T extends string, Params = ParseUrlParams<T>>(config: CreateRouteConfig<T>): Route<Params>;
99
+ export declare function createRoute<T extends string, Params extends object | void = ParseUrlParams<T>>(config: CreateRouteConfig<T>): PathRoute<Params>;
100
+
101
+ export declare function createRoute<Params extends object | void = void>(config?: WithBaseRouteConfig): PathlessRoute<Params>;
95
102
 
96
- declare type CreateRouteConfig<Path> = ValidatePath<Path> extends ['invalid', infer Template] ? {
103
+ declare type CreateRouteConfig<Path> = ValidatePath<Path> extends ['invalid', infer Template] ? WithBaseRouteConfig<{
97
104
  path: Template;
98
- parent?: Route<any>;
99
- beforeOpen?: Effect<void, any, any>[];
100
- } : {
105
+ }> : WithBaseRouteConfig<{
101
106
  path: Path;
102
107
  parent?: Route<any>;
103
108
  beforeOpen?: Effect<void, any, any>[];
104
- };
109
+ }>;
105
110
 
106
111
  /**
107
112
  * @description Creates argon router
@@ -191,11 +196,56 @@ export declare function createVirtualRoute<T = void, TransformerResult = void>(o
191
196
  */
192
197
  export declare function group(routes: Route<any>[]): VirtualRoute<void, void>;
193
198
 
199
+ export declare function historyAdapter(history: History_2): RouterAdapter;
200
+
201
+ declare type InputRoute = PathRoute<any> | {
202
+ path: string;
203
+ route: PathlessRoute<any>;
204
+ } | Router;
205
+
206
+ declare type InternalOpenedPayload<T> = RouteOpenedPayload<T> & {
207
+ navigate?: boolean;
208
+ };
209
+
210
+ declare interface InternalPathlessRoute<T extends object | void = any> extends PathlessRoute<T> {
211
+ internal: InternalRouteParams<T>;
212
+ }
213
+
214
+ declare interface InternalPathRoute<T extends object | void = any> extends PathRoute<T> {
215
+ internal: InternalRouteParams<T>;
216
+ }
217
+
218
+ declare type InternalRoute<T extends object | void = any> = InternalPathRoute<T> | InternalPathlessRoute<T>;
219
+
220
+ declare interface InternalRouteParams<T> {
221
+ close: EventCallable<void>;
222
+ navigated: EventCallable<RouteOpenedPayload<T>>;
223
+ openFx: Effect<InternalOpenedPayload<T>, InternalOpenedPayload<T>, Error>;
224
+ forceOpenParentFx: Effect<InternalOpenedPayload<T>, InternalOpenedPayload<T>, Error>;
225
+ setAsyncImport: (value: AsyncBundleImport) => void;
226
+ }
227
+
228
+ export declare const is: {
229
+ route<T extends object | void = void>(input: unknown): input is Route<T>;
230
+ pathRoute<T extends object | void = void>(input: unknown): input is PathRoute<T>;
231
+ pathlessRoute<T extends object | void = void>(input: unknown): input is PathlessRoute<T>;
232
+ router(input: unknown): input is Router;
233
+ };
234
+
235
+ declare type ListenCallback = (location: RouterLocation) => void;
236
+
194
237
  declare type LocationState = {
195
238
  path: string;
196
239
  query: Query;
197
240
  };
198
241
 
242
+ export declare type MappedRoute = {
243
+ route: InternalRoute<any>;
244
+ path: string;
245
+ build: Builder<any>;
246
+ parse: Parser<any>;
247
+ };
248
+
199
249
  export declare type NavigatePayload = {
200
250
  query: Query;
201
251
  path?: string;
@@ -207,23 +257,8 @@ export declare type OpenPayloadBase = {
207
257
  replace?: boolean;
208
258
  };
209
259
 
210
- export declare type Query = Record<string, string | null | Array<string | null>>;
211
-
212
- export declare interface QueryTracker<ParametersConfig extends ZodType> {
213
- entered: Event_2<z.infer<ParametersConfig>>;
214
- exited: Event_2<void>;
215
- enter: EventCallable<z.infer<ParametersConfig>>;
216
- exit: EventCallable<{
217
- ignoreParams: string[];
218
- } | void>;
219
- }
220
-
221
- export declare type QueryTrackerConfig<ParametersConfig extends ZodType> = {
222
- forRoutes?: Route<any>[];
223
- parameters: ParametersConfig;
224
- };
225
-
226
- export declare interface Route<T = void> {
260
+ declare interface PathlessRoute<T extends object | void = void> {
261
+ '@@type': 'pathless-route';
227
262
  $params: Store<T>;
228
263
  $isOpened: Store<boolean>;
229
264
  $isPending: Store<boolean>;
@@ -232,8 +267,7 @@ export declare interface Route<T = void> {
232
267
  openedOnServer: Event_2<RouteOpenedPayload<T>>;
233
268
  openedOnClient: Event_2<RouteOpenedPayload<T>>;
234
269
  closed: Event_2<void>;
235
- path: string;
236
- parent?: Route<any>;
270
+ parent?: PathRoute<any> | PathlessRoute<any>;
237
271
  beforeOpen?: Effect<any, any, any>[];
238
272
  '@@unitShape': () => {
239
273
  params: Store<T>;
@@ -243,19 +277,46 @@ export declare interface Route<T = void> {
243
277
  };
244
278
  }
245
279
 
246
- export declare type RouteOpenedPayload<T> = T extends void ? void | undefined | OpenPayloadBase : {
280
+ declare interface PathRoute<T extends object | void = void> extends Omit<PathlessRoute<T>, '@@type'> {
281
+ '@@type': 'path-route';
282
+ path: string;
283
+ }
284
+
285
+ export declare type Query = Record<string, string | null | Array<string | null>>;
286
+
287
+ export declare function queryAdapter(history: History_2): RouterAdapter;
288
+
289
+ export declare interface QueryTracker<ParametersConfig extends ZodType> {
290
+ entered: Event_2<z.infer<ParametersConfig>>;
291
+ exited: Event_2<void>;
292
+ enter: EventCallable<z.infer<ParametersConfig>>;
293
+ exit: EventCallable<{
294
+ ignoreParams: string[];
295
+ } | void>;
296
+ }
297
+
298
+ export declare type QueryTrackerConfig<ParametersConfig extends ZodType> = {
299
+ forRoutes?: Route<any>[];
300
+ check?: Event_2<void>;
301
+ parameters: ParametersConfig;
302
+ };
303
+
304
+ export declare type Route<T extends object | void = void> = PathRoute<T> | PathlessRoute<T>;
305
+
306
+ export declare type RouteOpenedPayload<T> = T extends void ? void | OpenPayloadBase : {
247
307
  params: T;
248
308
  } & OpenPayloadBase;
249
309
 
250
310
  export declare interface Router {
311
+ '@@type': 'router';
251
312
  $query: Store<Query>;
252
313
  $path: Store<string>;
314
+ $history: Store<RouterAdapter | null>;
253
315
  $activeRoutes: Store<Route<any>[]>;
254
316
  back: EventCallable<void>;
255
317
  forward: EventCallable<void>;
256
318
  navigate: EventCallable<NavigatePayload>;
257
- setHistory: EventCallable<History_2>;
258
- routes: Route<any>[];
319
+ setHistory: EventCallable<RouterAdapter>;
259
320
  /**
260
321
  * @description Creates query params tracker
261
322
  * @param config Query tacker config
@@ -282,12 +343,12 @@ export declare interface Router {
282
343
  * ```
283
344
  */
284
345
  trackQuery: <ParametersConfig extends ZodType>(config: QueryTrackerConfig<ParametersConfig>) => QueryTracker<ParametersConfig>;
285
- mappedRoutes: {
286
- route: Route<any>;
346
+ ownRoutes: MappedRoute[];
347
+ knownRoutes: MappedRoute[];
348
+ registerRoute: (route: PathRoute<any> | {
287
349
  path: string;
288
- build: Builder<any>;
289
- parse: Parser<any>;
290
- }[];
350
+ route: PathlessRoute<any>;
351
+ } | Router) => void;
291
352
  '@@unitShape': () => {
292
353
  query: Store<Query>;
293
354
  path: Store<string>;
@@ -298,17 +359,27 @@ export declare interface Router {
298
359
  };
299
360
  }
300
361
 
362
+ export declare interface RouterAdapter {
363
+ location: RouterLocation;
364
+ push: (to: To) => void;
365
+ replace: (to: To) => void;
366
+ goBack: () => void;
367
+ goForward: () => void;
368
+ listen: (callback: ListenCallback) => Subscription;
369
+ }
370
+
301
371
  declare interface RouterConfig {
302
372
  base?: string;
303
- routes: Route<any>[];
373
+ routes: InputRoute[];
374
+ controls?: RouterControls;
304
375
  }
305
376
 
306
377
  declare interface RouterControls {
307
- $history: StoreWritable<History_2 | null>;
378
+ $history: StoreWritable<RouterAdapter | null>;
308
379
  $locationState: StoreWritable<LocationState>;
309
380
  $query: Store<Query>;
310
381
  $path: Store<string>;
311
- setHistory: EventCallable<History_2>;
382
+ setHistory: EventCallable<RouterAdapter>;
312
383
  navigate: EventCallable<NavigatePayload>;
313
384
  back: EventCallable<void>;
314
385
  forward: EventCallable<void>;
@@ -321,7 +392,7 @@ declare interface RouterControls {
321
392
  * @param config Query tacker config
322
393
  * @link https://movpushmov.dev/argon-router/core/track-query.html
323
394
  * @example ```ts
324
- * import { z } from 'zod';
395
+ * import { z } from 'zod/v4';
325
396
  * import { router } from '@shared/router';
326
397
  * import { createDialog } from '...';
327
398
  *
@@ -346,7 +417,16 @@ declare interface RouterControls {
346
417
  trackQuery: <T extends ZodType>(config: Omit<QueryTrackerConfig<T>, 'forRoutes'>) => QueryTracker<T>;
347
418
  }
348
419
 
420
+ export declare interface RouterLocation {
421
+ pathname: string;
422
+ search: string;
423
+ hash: string;
424
+ }
425
+
426
+ declare type To = string | Partial<RouterLocation>;
427
+
349
428
  export declare interface VirtualRoute<T, TransformerResult> {
429
+ '@@type': 'pathless-route';
350
430
  $params: StoreWritable<TransformerResult>;
351
431
  $isOpened: StoreWritable<boolean>;
352
432
  $isPending: Store<boolean>;
@@ -374,4 +454,9 @@ declare interface VirtualRouteOptions<T, TransformerResult> {
374
454
  transformer?: (payload: T) => TransformerResult;
375
455
  }
376
456
 
457
+ declare type WithBaseRouteConfig<T = void> = T & {
458
+ parent?: Route<any>;
459
+ beforeOpen?: Effect<void, any, any>[];
460
+ };
461
+
377
462
  export { }