@argon-router/core 0.10.1 → 0.11.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"),r=require("patronum");const n={any:Symbol("any"),number:Symbol("number"),string:Symbol("string"),array:Symbol("array"),boolean:Symbol("boolean")};function t(e,a){for(const r of e)if(a.includes(r))return!0;return!1}function s(e,a){for(const r in a){const t=a[r];if(Array.isArray(t)&&(!e[r]||JSON.stringify(t)!==e[r]))return!1;switch(typeof t){case"number":if(!e[r]||t.toString()!==e[r])return!1;break;case"object":if(!e[r]||JSON.stringify(t)!==e[r])return!1;break;case"string":if(!e[r]||t!==e[r])return!1;break;case"boolean":if(!e[r]||!["0","1","false","true"].includes(e[r]))return!1}switch(t){case n.any:if(!e[r])return!1;break;case n.string:if(!e[r]||Array.isArray(e[r]))return!1;break;case n.array:if(!e[r]||!Array.isArray(e[r]))return!1;break;case n.number:if(!e[r]||Array.isArray(e[r])||isNaN(parseInt(e[r]))&&isNaN(parseFloat(e[r])))return!1;break;case n.boolean:if(!e[r]||Array.isArray(e[r])||!["0","1","false","true"].includes(e[r]))return!1}}return!0}function o(a){let{$query:r,navigate:n}=a;return i({$activeRoutes:e.createStore([],{name:"$activeRoutes",sid:"85ms46"}),$query:r,navigate:n})}function i(a){let{$activeRoutes:r,$query:o,navigate:i}=a;return a=>{const{parameters:c,forRoutes:l}=a,p=e.createStore(!1,{name:"$entered",sid:"-mo5ecc"}),d=e.createEvent({name:"entered",sid:"kuzfr"}),u=e.createEvent({name:"exited",sid:"-jzwna6"}),m=e.createEvent({name:"exit",sid:"7hfy2r"}),f=e.createEvent({name:"changeEntered",sid:"qh8w6v"});return e.sample({and:[{clock:f,target:p}],or:{sid:"-gf1fe4"}}),e.sample({and:[{source:{activeRoutes:r,query:o},filter:e=>{let{activeRoutes:a,query:r}=e;return(!l||t(l,a))&&s(r,c)},fn:e=>{let{query:a}=e;return function(e,a){const r={};for(const t in a){const s=a[t],o=e[t];if(Array.isArray(s)){const a=e[t];r[t]=a;continue}switch(typeof s){case"number":r[t]=isNaN(parseInt(o))?parseFloat(o):parseInt(o);break;case"object":r[t]=JSON.parse(o);break;case"string":r[t]=o;case"boolean":r[t]="1"===o||"true"===o}switch(s){case n.any:case n.string:case n.array:r[t]=e[t];break;case n.number:{const a=e[t];r[t]=isNaN(parseInt(a))?parseFloat(a):parseInt(a);break}case n.boolean:{const a=e[t];r[t]="1"===a||"true"===a;break}}}return r}(a,c)},target:[d,f.prepend(()=>!0)]}],or:{sid:"-gcagfb"}}),e.sample({and:[{source:{activeRoutes:r,query:o,entered:p},filter:e=>{let{activeRoutes:a,query:r,entered:n}=e;return n&&!((!l||t(l,a))&&s(r,c))},target:[u.prepend(()=>{}),f.prepend(()=>!1)]}],or:{sid:"-fvsmmh"}}),e.sample({and:[{clock:m,source:o,fn:(e,a)=>{if(a&&a.ignoreParams){const r={};for(const n of a.ignoreParams)e[n]&&(r[n]=e[n]);return{query:r}}return{query:{}}},target:i}],or:{sid:"-f105e9"}}),{entered:d,exited:u,exit:m}}}function c(e){return a=>{const r=a.split("/").map(e=>e.trim()).filter(e=>""!==e);let n=null;function t(e,a){n||(n={}),n[e]=a}if(0===e.length)return 0===r.length?{path:a,params:null}:null;for(let s=0;s<e.length;s++){const a=e[s];switch(a.type){case"const":if(a.name!==r.shift())return null;continue;case"parameter":{const{arrayProps:n,genericProps:o,required:i}=a.payload;if(n){const i=[];let c;for(;c=r.shift(),c;){switch(null==o?void 0:o.type){case"number":if(isNaN(+c))return null;i.push(+c);break;case"union":if(!o.items.includes(c))return null;i.push(c);break;default:i.push(c)}if(i.length>=(n.max??1/0))break}if(i.length<(n.min??0))return null;if(r.length>0&&!e[s+1])return null;t(a.name,i);break}const c=r.shift();if(i&&!c)return null;if(!c){t(a.name,void 0);continue}switch(null==o?void 0:o.type){case"number":if(isNaN(+c))return null;t(a.name,+c);break;case"union":if(!o.items.includes(c))return null;t(a.name,c);break;default:t(a.name,c)}}}}return r.length>0?null:{path:a,params:n}}}function l(e){if(!e)return null;const a=e[1];let r,n,t;for(const s of e.slice(2))s&&(s.includes("<")?r=s.replaceAll(/\s/g,"").replace("<","").replace(">",""):(s.includes("{")&&(n=s.replace("{","").replace("}","").split(",").map(e=>parseInt(e))),["*","?","+"].includes(s)&&(t=s)));return{name:a,genericProps:r,arrayProps:n,modificator:t}}function p(e){return a=>{const r=[];if(0===e.length)return"/";for(const n of e)switch(n.type){case"const":r.push(n.name);break;case"parameter":if(!a[n.name])continue;if(Array.isArray(a[n.name]))for(const e of a[n.name])r.push(e.toString());else r.push(a[n.name].toString())}return`/${r.join("/")}`}}function d(){const r=e.createStore(null,{and:{serialize:"ignore"},name:"$history",sid:"-ld7lzl"}),n=e.createStore({query:{},path:null},{name:"$locationState",sid:"-4u3w85"}),t=n.map(e=>e.query),s=n.map(e=>e.path),i=e.createEvent({name:"setHistory",sid:"-ormmkk"}),c=e.createEvent({name:"navigate",sid:"tawqep"}),l=e.createEvent({name:"back",sid:"bxy8rt"}),p=e.createEvent({name:"forward",sid:"-bpmzb1"}),d=e.createEvent({name:"locationUpdated",sid:"lkzldx"}),u=e.attach({and:{source:r,effect:(e,r)=>{let{path:n,query:t,replace:s}=r;if(!e)throw new Error("history not found");const o={pathname:n,search:`?${a.stringify(t)}`};s?e.replace(o):e.push(o)}},or:{name:"navigateFx",sid:"-ov1xn7"}}),m=e.createEffect(r=>{const n=e.scopeBind(d);if(n({pathname:r.location.pathname,query:{...a.parse(r.location.search)}}),!r)throw new Error;r.listen(e=>{let{location:r}=e;n({pathname:r.pathname,query:{...a.parse(r.search)}})})},{name:"subscribeHistoryFx",sid:"-m60vds"});return e.sample({and:[{clock:i,target:r}],or:{sid:"ii4q"}}),e.sample({and:[{clock:r,filter:Boolean,target:m}],or:{sid:"39h3j"}}),e.sample({and:[{clock:d,fn:e=>({path:e.pathname,query:e.query}),target:n}],or:{sid:"i3x4a"}}),e.sample({and:[{clock:c,source:s,fn:(e,a)=>({path:e,...a}),target:u}],or:{sid:"ylqx4"}}),{$history:r,$locationState:n,$query:t,$path:s,setHistory:i,navigate:c,back:l,forward:p,locationUpdated:d,trackQuery:o({$query:t,navigate:c})}}function u(){let a=arguments.length>0&&void 0!==arguments[0]?arguments[0]:e.createStore(!1,{and:{name:"pending",sid:"r89aiv"},name:"pending",sid:"r89aiv"});const r=e.createStore(null,{name:"$params",sid:"-ftspin"}),n=e.createStore(!1,{name:"$isOpened",sid:"-v6936c"}),t=a,s=e.createEvent({name:"open",sid:"juc47v"}),o=e.createEvent({name:"opened",sid:"-quc8vc"}),i=e.createEvent({name:"openedOnServer",sid:"n25rh4"}),c=e.createEvent({name:"openedOnClient",sid:"-auqikx"}),l=e.createEvent({name:"close",sid:"4zlqo6"}),p=e.createEvent({name:"closed",sid:"wbpfrk"}),d=e.createEvent({name:"cancelled",sid:"-q3x5sf"});return e.sample({and:[{clock:s,target:o}],or:{sid:"-u8b34x"}}),e.split({and:[{source:o,match:()=>"undefined"==typeof window?"server":"client",cases:{server:i,client:c}}],or:{sid:"-u5k464"}}),e.sample({and:[{clock:l,target:p}],or:{sid:"-tp2ada"}}),e.sample({and:[{clock:[o.map(()=>!0),p.map(()=>!1)],target:n}],or:{sid:"-tarmxw"}}),{$params:r,$isOpened:n,$isPending:t,open:s,opened:o,openedOnClient:c,openedOnServer:i,close:l,closed:p,cancelled:d,path:null,"@@unitShape":()=>({params:r,isOpened:n,isPending:t,onOpen:s})}}exports.chainRoute=function(a){const{route:r,beforeOpen:n,openOn:t,cancelOn:s}=a;let o;const i=e.createEffect(()=>null==o?void 0:o(),{name:"waitForAsyncBundleFx",sid:"-tvp99n"}),c=e.createEffect(async e=>{await i();for(const a of[].concat(n))await a(e)},{name:"openFx",sid:"-9kc1je"}),l=u(c.pending);return e.sample({and:[{clock:r.opened,target:c}],or:{sid:"1162lk"}}),e.sample({and:[{clock:r.opened,fn:e=>e&&"params"in e?e.params:null,target:l.$params}],or:{sid:"13x1kd"}}),t&&e.sample({and:[{clock:t,source:{params:l.$params},fn:e=>{let{params:a}=e;return{params:a}},target:l.open}],or:{sid:"1kevex"}}),s&&(e.sample({and:[{clock:[r.closed].concat(s),target:l.close}],or:{sid:"20wp7r"}}),e.sample({and:[{clock:[].concat(s),target:l.cancelled}],or:{sid:"2f7cn5"}})),Object.assign(l,{internal:{setAsyncImport:e=>o=e}})},exports.createRoute=function(a){let r;const n=e.createEffect(async e=>{await f(),await y();const r=a.parent;return r&&await r.internal.openFx({...e??{params:{}},navigate:!1}),e},{name:"openFx",sid:"awhgwd"}),t=e.createStore({},{name:"$params",sid:"-oahffx"}),s=e.createStore(!1,{name:"$isOpened",sid:"-6l68oe"}),o=n.pending,i=e.createEvent({name:"open",sid:"gjsrgc"}),c=e.createEvent({name:"close",sid:"-yagmc8"}),l=e.createEvent({name:"opened",sid:"x0iwhi"}),p=e.createEvent({name:"openedOnServer",sid:"346r3u"}),d=e.createEvent({name:"openedOnClient",sid:"31q95t"}),u=e.createEvent({name:"navigated",sid:"-t30l0x"}),m=e.createEvent({name:"closed",sid:"uue4ce"}),f=e.createEffect(()=>null==r?void 0:r(),{name:"waitForAsyncBundleFx",sid:"-nml5ho"}),y=e.createEffect(async()=>{for(const e of a.beforeOpen??[])await e()},{name:"beforeOpenFx",sid:"-vqlnbm"}),g=e.attach({and:{effect:n},or:{name:"navigatedFx",sid:"a4yadj"}}),h={};return e.sample({and:[{clock:i,target:n}],or:{sid:"ynxuww"}}),e.sample({and:[{clock:u,fn:e=>({navigate:!1,...e}),target:g}],or:{sid:"z28ica"}}),e.sample({and:[{clock:g.doneData,fn:e=>e&&"params"in e?{...e.params}:h,target:t}],or:{sid:"z5j9wg"}}),e.sample({and:[{clock:g.failData,fn:()=>h,target:t}],or:{sid:"-z1vw16"}}),e.split({and:[{source:g.doneData,match:()=>"undefined"==typeof window?"server":"client",cases:{server:p,client:d}}],or:{sid:"-yyl4h0"}}),e.sample({and:[{clock:[d,p],target:l}],or:{sid:"-yhji2t"}}),e.sample({and:[{clock:c,target:m}],or:{sid:"-y38unf"}}),e.sample({and:[{clock:[l.map(()=>!0),m.map(()=>!1)],target:s}],or:{sid:"-y0hvom"}}),{$params:t,$isOpened:s,$isPending:o,open:i,closed:m,opened:l,openedOnClient:d,openedOnServer:p,...a,internal:{navigated:u,close:c,openFx:n,setAsyncImport:e=>r=e},"@@unitShape":()=>({params:t,isPending:o,isOpened:s,onOpen:i})}},exports.createRouter=function(a){const{base:r="/",routes:n}=a,{$path:t,$query:s,back:o,forward:u,navigate:m,setHistory:f,locationUpdated:y}=d(),g=n.map(e=>{let a=e;const n=[];for(n.unshift(a.path);a.parent;)a=a.parent,"/"!==a.path&&n.unshift(a.path);const t="/"===r?n.join(""):[r,...n].join(""),{build:s,parse:o}=function(e){const a=[],r=/:(\w+)(<[\s?\w|]+>)?({\d+\,\d+})?([+*?])?/,n=e.split("/").filter(Boolean);for(let t=0;t<n.length;t++){const s=n[t];if(!s)continue;const o=l(s.match(r));if(!o){a.push({type:"const",name:s,payload:void 0});continue}const{arrayProps:i,genericProps:c,modificator:p,name:d}=o;if(!d)throw new Error(`Invalid path: "${e}". Name for argument must be provided`);const u={type:"parameter",name:d,payload:{required:!0}};switch(c&&"number"===c&&(u.payload.genericProps={type:"number"}),c&&c.includes("|")&&(u.payload.genericProps={type:"union",items:c.split("|")}),p){case"*":u.payload.arrayProps={};break;case"+":u.payload.arrayProps={min:1};break;case"?":u.payload.required=!1}i&&(u.payload.arrayProps={...u.payload.arrayProps,min:i[0],max:i[1]}),a.push(u)}return{parse:c(a),build:p(a)}}(t);return{route:e,path:t,build:s,parse:o}}),h=t.map(e=>{const a=[];if(!e)return a;for(const{route:r,parse:n}of g)n(e)&&a.push(r);return a}),v=e.attach({and:{source:{query:s,path:t},effect:async a=>{let{query:r,path:n}=a;for(const{route:t,parse:s}of g){const a=s(n),[o,i]=[e.scopeBind(t.internal.close),e.scopeBind(t.internal.navigated)];a?i({query:r,params:a.params}):o()}}},or:{name:"openRoutesByPathFx",sid:"-3zl7vq"}});for(const{route:i,build:c}of g)e.sample({and:[{clock:i.internal.openFx.doneData,filter:e=>!1!==(null==e?void 0:e.navigate),fn:e=>({path:c(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:s,$path:t,$activeRoutes:h,back:o,forward:u,navigate:m,routes:n,setHistory:f,mappedRoutes:g,trackQuery:i({$activeRoutes:h,$query:s,navigate:m}),"@@unitShape":()=>({query:s,path:t,activeRoutes:h,onBack:o,onForward:u,onNavigate:m})}},exports.createRouterControls=d,exports.createVirtualRoute=u,exports.group=function(a){const n=u(e.withFactory({sid:"-uirglg",fn:()=>r.or(...a.map(e=>e.$isPending)),name:"$isPending",method:"or"}));return e.sample({and:[{clock:a.map(e=>e.$isOpened),filter:e.withFactory({sid:"6pispd",fn:()=>r.or(...a.map(e=>e.$isOpened)),name:"filter",method:"or"}),fn:()=>{},target:n.open}],or:{sid:"-xn8czd"}}),e.sample({and:[{clock:a.map(e=>e.$isOpened),filter:e.withFactory({sid:"a0u5gq",fn:()=>r.not(e.withFactory({sid:"xb4bx2",fn:()=>r.or(...a.map(e=>e.$isOpened)),name:"fn",method:"or"})),name:"filter",method:"not"}),fn:()=>{},target:n.close}],or:{sid:"-x7u4d9"}}),n},exports.parameters=n;
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};
package/dist/index.d.ts CHANGED
@@ -9,23 +9,13 @@ import { Store } from 'effector';
9
9
  import { StoreWritable } from 'effector';
10
10
  import { Unit } from 'effector';
11
11
  import { ValidatePath } from '@argon-router/paths';
12
-
13
- declare type AnyParameter = typeof anySymbol;
14
-
15
- declare const anySymbol: unique symbol;
16
-
17
- declare type ArrayParameter = typeof arraySymbol;
18
-
19
- declare const arraySymbol: unique symbol;
12
+ import { z } from 'zod';
13
+ import { ZodType } from 'zod';
20
14
 
21
15
  declare type BeforeOpenUnit<T> = (T extends void ? EventCallable<void> | EventCallable<OpenPayloadBase> : EventCallable<{
22
16
  params: T;
23
17
  } & OpenPayloadBase>) | Effect<RouteOpenedPayload<T>, any>;
24
18
 
25
- declare type BooleanParameter = typeof booleanSymbol;
26
-
27
- declare const booleanSymbol: unique symbol;
28
-
29
19
  /**
30
20
  * @link https://movpushmov.dev/argon-router/core/chain-route.html
31
21
  * @param props Chain route props
@@ -67,7 +57,7 @@ declare const booleanSymbol: unique symbol;
67
57
  * const postLoadedRoute = chainRoute({ route: authorizedRoute, ... });
68
58
  * ```
69
59
  */
70
- export declare function chainRoute<T>(props: ChainRouteProps<T>): VirtualRoute<T>;
60
+ export declare function chainRoute<T>(props: ChainRouteProps<T>): VirtualRoute<RouteOpenedPayload<T>, T>;
71
61
 
72
62
  declare interface ChainRouteProps<T> {
73
63
  route: Route<T>;
@@ -179,7 +169,7 @@ export declare function createRouter(config: RouterConfig): Router;
179
169
  */
180
170
  export declare function createRouterControls(): RouterControls;
181
171
 
182
- export declare function createVirtualRoute<T>(pending?: Store<boolean>): VirtualRoute<T>;
172
+ export declare function createVirtualRoute<T = void, TransformerResult = void>(options?: VirtualRouteOptions<T, TransformerResult>): VirtualRoute<T, TransformerResult>;
183
173
 
184
174
  /**
185
175
  * @description Create virtual route which opens when some passed routes is opened. Closes if all passed routes are closed.
@@ -199,7 +189,7 @@ export declare function createVirtualRoute<T>(pending?: Store<boolean>): Virtual
199
189
  * signUpRoute.close(); // authorizationRoute.$isOpened —> false
200
190
  * ```
201
191
  */
202
- export declare function group(routes: Route<any>[]): VirtualRoute<void>;
192
+ export declare function group(routes: Route<any>[]): VirtualRoute<void, void>;
203
193
 
204
194
  declare type LocationState = {
205
195
  path: string;
@@ -212,46 +202,27 @@ export declare type NavigatePayload = {
212
202
  replace?: boolean;
213
203
  };
214
204
 
215
- declare type NumberParameter = typeof numberSymbol;
216
-
217
- declare const numberSymbol: unique symbol;
218
-
219
205
  export declare type OpenPayloadBase = {
220
206
  query?: Query;
221
207
  replace?: boolean;
222
208
  };
223
209
 
224
- export declare const parameters: Parameters_2;
225
-
226
- declare type Parameters_2 = {
227
- any: AnyParameter;
228
- number: NumberParameter;
229
- string: StringParameter;
230
- array: ArrayParameter;
231
- boolean: BooleanParameter;
232
- };
233
-
234
210
  export declare type Query = Record<string, string | null | Array<string | null>>;
235
211
 
236
- export declare interface QueryTracker<ParametersConfig extends RawConfig> {
237
- entered: Event_2<ReadyConfig<ParametersConfig>>;
212
+ export declare interface QueryTracker<ParametersConfig extends ZodType> {
213
+ entered: Event_2<z.infer<ParametersConfig>>;
238
214
  exited: Event_2<void>;
215
+ enter: EventCallable<z.infer<ParametersConfig>>;
239
216
  exit: EventCallable<{
240
217
  ignoreParams: string[];
241
218
  } | void>;
242
219
  }
243
220
 
244
- export declare type QueryTrackerConfig<ParametersConfig extends RawConfig> = {
221
+ export declare type QueryTrackerConfig<ParametersConfig extends ZodType> = {
245
222
  forRoutes?: Route<any>[];
246
223
  parameters: ParametersConfig;
247
224
  };
248
225
 
249
- export declare type RawConfig = Record<string, AnyParameter | ArrayParameter | NumberParameter | StringParameter | BooleanParameter | SupportedPrimitive | SupportedPrimitive[]>;
250
-
251
- export declare type ReadyConfig<T extends RawConfig> = {
252
- [K in keyof T]: T[K] extends StringParameter ? string : T[K] extends NumberParameter ? number : T[K] extends ArrayParameter ? string[] : T[K] extends AnyParameter ? string | string[] : never;
253
- };
254
-
255
226
  export declare interface Route<T = void> {
256
227
  $params: Store<T>;
257
228
  $isOpened: Store<boolean>;
@@ -310,7 +281,7 @@ export declare interface Router {
310
281
  * // /team?dialog=team&id=not_number
311
282
  * ```
312
283
  */
313
- trackQuery: <ParametersConfig extends RawConfig>(config: QueryTrackerConfig<ParametersConfig>) => QueryTracker<ParametersConfig>;
284
+ trackQuery: <ParametersConfig extends ZodType>(config: QueryTrackerConfig<ParametersConfig>) => QueryTracker<ParametersConfig>;
314
285
  mappedRoutes: {
315
286
  route: Route<any>;
316
287
  path: string;
@@ -350,14 +321,16 @@ declare interface RouterControls {
350
321
  * @param config Query tacker config
351
322
  * @link https://movpushmov.dev/argon-router/core/track-query.html
352
323
  * @example ```ts
353
- * import { parameters } from '@argon-router/core';
324
+ * import { z } from 'zod';
354
325
  * import { router } from '@shared/router';
355
326
  * import { createDialog } from '...';
356
327
  *
357
328
  * const dialog = createDialog();
358
329
  * const tracker = router.trackQuery({
359
- * dialog: 'team-member',
360
- * id: parameters.number,
330
+ * parameters: {
331
+ * dialog: z.literal('team-member'),
332
+ * id: z.cource.number(),
333
+ * },
361
334
  * });
362
335
  *
363
336
  * // triggered for:
@@ -370,19 +343,35 @@ declare interface RouterControls {
370
343
  * // /team?dialog=team&id=not_number
371
344
  * ```
372
345
  */
373
- trackQuery: <T extends RawConfig>(config: Omit<QueryTrackerConfig<T>, 'forRoutes'>) => QueryTracker<T>;
346
+ trackQuery: <T extends ZodType>(config: Omit<QueryTrackerConfig<T>, 'forRoutes'>) => QueryTracker<T>;
374
347
  }
375
348
 
376
- declare type StringParameter = typeof stringSymbol;
377
-
378
- declare const stringSymbol: unique symbol;
379
-
380
- declare type SupportedPrimitive = string | number | Date | boolean;
381
-
382
- export declare interface VirtualRoute<T = any> extends Route<T> {
383
- $params: StoreWritable<T>;
349
+ export declare interface VirtualRoute<T, TransformerResult> {
350
+ $params: StoreWritable<TransformerResult>;
351
+ $isOpened: StoreWritable<boolean>;
352
+ $isPending: Store<boolean>;
353
+ open: EventCallable<T>;
354
+ opened: Event_2<T>;
355
+ openedOnServer: Event_2<T>;
356
+ openedOnClient: Event_2<T>;
384
357
  close: EventCallable<void>;
358
+ closed: Event_2<void>;
385
359
  cancelled: Event_2<void>;
360
+ path: string;
361
+ beforeOpen?: Effect<any, any, any>[];
362
+ '@@unitShape': () => {
363
+ params: Store<TransformerResult>;
364
+ isOpened: Store<boolean>;
365
+ isPending: Store<boolean>;
366
+ onOpen: EventCallable<T>;
367
+ onClose: EventCallable<void>;
368
+ };
369
+ }
370
+
371
+ declare interface VirtualRouteOptions<T, TransformerResult> {
372
+ beforeOpen?: Effect<void, any, any>[];
373
+ $isPending?: Store<boolean>;
374
+ transformer?: (payload: T) => TransformerResult;
386
375
  }
387
376
 
388
377
  export { }
package/dist/index.js CHANGED
@@ -192,18 +192,6 @@ function createRoute(config) {
192
192
  })
193
193
  };
194
194
  }
195
- const anySymbol = Symbol("any");
196
- const numberSymbol = Symbol("number");
197
- const stringSymbol = Symbol("string");
198
- const arraySymbol = Symbol("array");
199
- const booleanSymbol = Symbol("boolean");
200
- const parameters = {
201
- any: anySymbol,
202
- number: numberSymbol,
203
- string: stringSymbol,
204
- array: arraySymbol,
205
- boolean: booleanSymbol
206
- };
207
195
  function isForRouteActive(forRoutes, activeRoutes) {
208
196
  for (const route of forRoutes) {
209
197
  if (activeRoutes.includes(route)) {
@@ -212,121 +200,6 @@ function isForRouteActive(forRoutes, activeRoutes) {
212
200
  }
213
201
  return false;
214
202
  }
215
- function isHaveValidParams(query, neededParameters) {
216
- for (const key in neededParameters) {
217
- const parameterType = neededParameters[key];
218
- if (Array.isArray(parameterType) && (!query[key] || JSON.stringify(parameterType) !== query[key])) {
219
- return false;
220
- }
221
- switch (typeof parameterType) {
222
- case "number": {
223
- if (!query[key] || parameterType.toString() !== query[key]) {
224
- return false;
225
- }
226
- break;
227
- }
228
- case "object": {
229
- if (!query[key] || JSON.stringify(parameterType) !== query[key]) {
230
- return false;
231
- }
232
- break;
233
- }
234
- case "string": {
235
- if (!query[key] || parameterType !== query[key]) {
236
- return false;
237
- }
238
- break;
239
- }
240
- case "boolean": {
241
- if (!query[key] || !["0", "1", "false", "true"].includes(query[key])) {
242
- return false;
243
- }
244
- break;
245
- }
246
- }
247
- switch (parameterType) {
248
- case parameters.any: {
249
- if (!query[key]) {
250
- return false;
251
- }
252
- break;
253
- }
254
- case parameters.string: {
255
- if (!query[key] || Array.isArray(query[key])) {
256
- return false;
257
- }
258
- break;
259
- }
260
- case parameters.array: {
261
- if (!query[key] || !Array.isArray(query[key])) {
262
- return false;
263
- }
264
- break;
265
- }
266
- case parameters.number: {
267
- if (!query[key] || Array.isArray(query[key]) || isNaN(parseInt(query[key])) && isNaN(parseFloat(query[key]))) {
268
- return false;
269
- }
270
- break;
271
- }
272
- case parameters.boolean: {
273
- if (!query[key] || Array.isArray(query[key]) || !["0", "1", "false", "true"].includes(query[key])) {
274
- return false;
275
- }
276
- break;
277
- }
278
- }
279
- }
280
- return true;
281
- }
282
- function transformParams(query, neededParameters) {
283
- const result = {};
284
- for (const key in neededParameters) {
285
- const parameterType = neededParameters[key];
286
- const data = query[key];
287
- if (Array.isArray(parameterType)) {
288
- const arrayData = query[key];
289
- result[key] = arrayData;
290
- continue;
291
- }
292
- switch (typeof parameterType) {
293
- case "number": {
294
- result[key] = isNaN(parseInt(data)) ? parseFloat(data) : parseInt(data);
295
- break;
296
- }
297
- case "object": {
298
- result[key] = JSON.parse(data);
299
- break;
300
- }
301
- case "string": {
302
- result[key] = data;
303
- }
304
- case "boolean": {
305
- result[key] = data === "1" || data === "true";
306
- break;
307
- }
308
- }
309
- switch (parameterType) {
310
- case parameters.any:
311
- case parameters.string:
312
- case parameters.array: {
313
- result[key] = query[key];
314
- break;
315
- }
316
- case parameters.number: {
317
- const data2 = query[key];
318
- result[key] = isNaN(parseInt(data2)) ? parseFloat(data2) : parseInt(data2);
319
- break;
320
- }
321
- case parameters.boolean: {
322
- const data2 = query[key];
323
- result[key] = data2 === "1" || data2 === "true";
324
- break;
325
- }
326
- }
327
- }
328
- return result;
329
- }
330
203
  function trackQueryControlsFactory(_ref) {
331
204
  let {
332
205
  $query,
@@ -335,7 +208,7 @@ function trackQueryControlsFactory(_ref) {
335
208
  return trackQueryFactory({
336
209
  $activeRoutes: createStore([], {
337
210
  name: "$activeRoutes",
338
- sid: "85ms46"
211
+ sid: "ni3bf8"
339
212
  }),
340
213
  $query,
341
214
  navigate
@@ -349,28 +222,32 @@ function trackQueryFactory(_ref2) {
349
222
  } = _ref2;
350
223
  return (config) => {
351
224
  const {
352
- parameters: parameters2,
225
+ parameters,
353
226
  forRoutes
354
227
  } = config;
355
228
  const $entered = createStore(false, {
356
229
  name: "$entered",
357
- sid: "-mo5ecc"
230
+ sid: "-i5493b"
358
231
  });
359
232
  const entered = createEvent({
360
233
  name: "entered",
361
- sid: "kuzfr"
234
+ sid: "9i8bun"
362
235
  });
363
236
  const exited = createEvent({
364
237
  name: "exited",
365
- sid: "-jzwna6"
238
+ sid: "-p2hcsy"
239
+ });
240
+ const enter = createEvent({
241
+ name: "enter",
242
+ sid: "30cmky"
366
243
  });
367
244
  const exit = createEvent({
368
245
  name: "exit",
369
- sid: "7hfy2r"
246
+ sid: "-2657ec"
370
247
  });
371
248
  const changeEntered = createEvent({
372
249
  name: "changeEntered",
373
- sid: "qh8w6v"
250
+ sid: "-5jm7r1"
374
251
  });
375
252
  sample({
376
253
  and: [{
@@ -378,7 +255,7 @@ function trackQueryFactory(_ref2) {
378
255
  target: $entered
379
256
  }],
380
257
  or: {
381
- sid: "-gf1fe4"
258
+ sid: "-j6nk9y"
382
259
  }
383
260
  });
384
261
  sample({
@@ -392,18 +269,18 @@ function trackQueryFactory(_ref2) {
392
269
  activeRoutes,
393
270
  query
394
271
  } = _ref3;
395
- return (!forRoutes || isForRouteActive(forRoutes, activeRoutes)) && isHaveValidParams(query, parameters2);
272
+ return (!forRoutes || isForRouteActive(forRoutes, activeRoutes)) && parameters.safeParse(query).success;
396
273
  },
397
274
  fn: (_ref4) => {
398
275
  let {
399
276
  query
400
277
  } = _ref4;
401
- return transformParams(query, parameters2);
278
+ return parameters.safeParse(query).data;
402
279
  },
403
280
  target: [entered, changeEntered.prepend(() => true)]
404
281
  }],
405
282
  or: {
406
- sid: "-gcagfb"
283
+ sid: "-iscwuk"
407
284
  }
408
285
  });
409
286
  sample({
@@ -419,12 +296,30 @@ function trackQueryFactory(_ref2) {
419
296
  query,
420
297
  entered: entered2
421
298
  } = _ref5;
422
- return entered2 && !((!forRoutes || isForRouteActive(forRoutes, activeRoutes)) && isHaveValidParams(query, parameters2));
299
+ return entered2 && !((!forRoutes || isForRouteActive(forRoutes, activeRoutes)) && parameters.safeParse(query).success);
423
300
  },
424
301
  target: [exited.prepend(() => void 0), changeEntered.prepend(() => false)]
425
302
  }],
426
303
  or: {
427
- sid: "-fvsmmh"
304
+ sid: "-ibv31q"
305
+ }
306
+ });
307
+ sample({
308
+ and: [{
309
+ clock: enter,
310
+ source: $query,
311
+ fn: (query, payload) => {
312
+ return {
313
+ query: {
314
+ ...query,
315
+ ...payload
316
+ }
317
+ };
318
+ },
319
+ target: navigate
320
+ }],
321
+ or: {
322
+ sid: "-hsmaa3"
428
323
  }
429
324
  });
430
325
  sample({
@@ -450,10 +345,11 @@ function trackQueryFactory(_ref2) {
450
345
  target: navigate
451
346
  }],
452
347
  or: {
453
- sid: "-f105e9"
348
+ sid: "-whgzm0"
454
349
  }
455
350
  });
456
351
  return {
352
+ enter,
457
353
  entered,
458
354
  exited,
459
355
  exit
@@ -642,8 +538,8 @@ function compile(path) {
642
538
  if (!parsedToken) {
643
539
  continue;
644
540
  }
645
- const parameters2 = getTokenParameters(parsedToken.match(regexp));
646
- if (!parameters2) {
541
+ const parameters = getTokenParameters(parsedToken.match(regexp));
542
+ if (!parameters) {
647
543
  tokens.push({
648
544
  type: "const",
649
545
  name: parsedToken,
@@ -656,7 +552,7 @@ function compile(path) {
656
552
  genericProps,
657
553
  modificator,
658
554
  name
659
- } = parameters2;
555
+ } = parameters;
660
556
  if (!name) {
661
557
  throw new Error(`Invalid path: "${path}". Name for argument must be provided`);
662
558
  }
@@ -1014,58 +910,68 @@ function createRouter(config) {
1014
910
  };
1015
911
  }
1016
912
  function createVirtualRoute() {
1017
- let pending = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : createStore(false, {
1018
- and: {
1019
- name: "pending",
1020
- sid: "r89aiv"
1021
- },
1022
- name: "pending",
1023
- sid: "r89aiv"
1024
- });
913
+ let options = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
914
+ const {
915
+ beforeOpen,
916
+ $isPending = createStore(false, {
917
+ name: "$isPending",
918
+ sid: "-f18bwu"
919
+ }),
920
+ transformer = (payload) => payload ?? null
921
+ } = options;
1025
922
  const $params = createStore(null, {
1026
923
  name: "$params",
1027
- sid: "-ftspin"
924
+ sid: "v2ropa"
1028
925
  });
1029
926
  const $isOpened = createStore(false, {
1030
927
  name: "$isOpened",
1031
- sid: "-v6936c"
928
+ sid: "mzzqqr"
1032
929
  });
1033
- const $isPending = pending;
1034
930
  const open = createEvent({
1035
931
  name: "open",
1036
- sid: "juc47v"
932
+ sid: "f33vnd"
1037
933
  });
1038
934
  const opened = createEvent({
1039
935
  name: "opened",
1040
- sid: "-quc8vc"
936
+ sid: "-efpvez"
1041
937
  });
1042
938
  const openedOnServer = createEvent({
1043
939
  name: "openedOnServer",
1044
- sid: "n25rh4"
940
+ sid: "o8st20"
1045
941
  });
1046
942
  const openedOnClient = createEvent({
1047
943
  name: "openedOnClient",
1048
- sid: "-auqikx"
944
+ sid: "xaagqn"
1049
945
  });
1050
946
  const close = createEvent({
1051
947
  name: "close",
1052
- sid: "4zlqo6"
948
+ sid: "-20upkw"
1053
949
  });
1054
950
  const closed = createEvent({
1055
951
  name: "closed",
1056
- sid: "wbpfrk"
952
+ sid: "avevxu"
1057
953
  });
1058
954
  const cancelled = createEvent({
1059
955
  name: "cancelled",
1060
- sid: "-q3x5sf"
956
+ sid: "808tq5"
1061
957
  });
1062
958
  sample({
1063
959
  and: [{
1064
960
  clock: open,
1065
- target: opened
961
+ target: [opened]
962
+ }],
963
+ or: {
964
+ sid: "p3r2ad"
965
+ }
966
+ });
967
+ sample({
968
+ and: [{
969
+ clock: open,
970
+ fn: transformer,
971
+ target: $params
1066
972
  }],
1067
973
  or: {
1068
- sid: "-u8b34x"
974
+ sid: "p6i196"
1069
975
  }
1070
976
  });
1071
977
  split({
@@ -1078,7 +984,7 @@ function createVirtualRoute() {
1078
984
  }
1079
985
  }],
1080
986
  or: {
1081
- sid: "-u5k464"
987
+ sid: "plch9x"
1082
988
  }
1083
989
  });
1084
990
  sample({
@@ -1087,7 +993,7 @@ function createVirtualRoute() {
1087
993
  target: closed
1088
994
  }],
1089
995
  or: {
1090
- sid: "-tp2ada"
996
+ sid: "q1ub2r"
1091
997
  }
1092
998
  });
1093
999
  sample({
@@ -1096,7 +1002,7 @@ function createVirtualRoute() {
1096
1002
  target: $isOpened
1097
1003
  }],
1098
1004
  or: {
1099
- sid: "-tarmxw"
1005
+ sid: "q4la1k"
1100
1006
  }
1101
1007
  });
1102
1008
  return {
@@ -1110,13 +1016,14 @@ function createVirtualRoute() {
1110
1016
  close,
1111
1017
  closed,
1112
1018
  cancelled,
1113
- // @ts-expect-error emulated path for virtual route
1114
- path: null,
1019
+ path: "",
1020
+ beforeOpen,
1115
1021
  "@@unitShape": () => ({
1116
1022
  params: $params,
1117
1023
  isOpened: $isOpened,
1118
1024
  isPending: $isPending,
1119
- onOpen: open
1025
+ onOpen: open,
1026
+ onClose: close
1120
1027
  })
1121
1028
  };
1122
1029
  }
@@ -1130,7 +1037,7 @@ function chainRoute(props) {
1130
1037
  let asyncImport;
1131
1038
  const waitForAsyncBundleFx = createEffect(() => asyncImport == null ? void 0 : asyncImport(), {
1132
1039
  name: "waitForAsyncBundleFx",
1133
- sid: "-tvp99n"
1040
+ sid: "qdkcuo"
1134
1041
  });
1135
1042
  const openFx = createEffect(async (payload) => {
1136
1043
  await waitForAsyncBundleFx();
@@ -1139,47 +1046,46 @@ function chainRoute(props) {
1139
1046
  }
1140
1047
  }, {
1141
1048
  name: "openFx",
1142
- sid: "-9kc1je"
1049
+ sid: "-fwntqy"
1050
+ });
1051
+ const transformer = (payload) => {
1052
+ if (!payload) {
1053
+ return null;
1054
+ }
1055
+ return "params" in payload ? payload.params : null;
1056
+ };
1057
+ const virtualRoute = createVirtualRoute({
1058
+ transformer
1143
1059
  });
1144
- const virtualRoute = createVirtualRoute(openFx.pending);
1145
1060
  sample({
1146
1061
  and: [{
1147
1062
  clock: route.opened,
1148
1063
  target: openFx
1149
1064
  }],
1150
1065
  or: {
1151
- sid: "1162lk"
1066
+ sid: "-s9xf6p"
1152
1067
  }
1153
1068
  });
1154
1069
  sample({
1155
1070
  and: [{
1156
1071
  clock: route.opened,
1157
- fn: (payload) => payload && "params" in payload ? payload.params : null,
1072
+ fn: transformer,
1158
1073
  target: virtualRoute.$params
1159
1074
  }],
1160
1075
  or: {
1161
- sid: "13x1kd"
1076
+ sid: "-1u78yc"
1162
1077
  }
1163
1078
  });
1164
1079
  if (openOn) {
1165
1080
  sample({
1166
1081
  and: [{
1167
1082
  clock: openOn,
1168
- source: {
1169
- params: virtualRoute.$params
1170
- },
1171
- fn: (_ref) => {
1172
- let {
1173
- params
1174
- } = _ref;
1175
- return {
1176
- params
1177
- };
1178
- },
1083
+ source: virtualRoute.$params,
1084
+ fn: (params) => params,
1179
1085
  target: virtualRoute.open
1180
1086
  }],
1181
1087
  or: {
1182
- sid: "1kevex"
1088
+ sid: "-1qcor3"
1183
1089
  }
1184
1090
  });
1185
1091
  }
@@ -1190,7 +1096,7 @@ function chainRoute(props) {
1190
1096
  target: virtualRoute.close
1191
1097
  }],
1192
1098
  or: {
1193
- sid: "20wp7r"
1099
+ sid: "-19uuy9"
1194
1100
  }
1195
1101
  });
1196
1102
  sample({
@@ -1199,7 +1105,7 @@ function chainRoute(props) {
1199
1105
  target: virtualRoute.cancelled
1200
1106
  }],
1201
1107
  or: {
1202
- sid: "2f7cn5"
1108
+ sid: "-vk7iv"
1203
1109
  }
1204
1110
  });
1205
1111
  }
@@ -1210,18 +1116,19 @@ function chainRoute(props) {
1210
1116
  });
1211
1117
  }
1212
1118
  function group(routes) {
1213
- const $isPending = withFactory({
1214
- sid: "-uirglg",
1215
- fn: () => or(...routes.map((route) => route.$isPending)),
1216
- name: "$isPending",
1217
- method: "or"
1119
+ const virtual = createVirtualRoute({
1120
+ $isPending: withFactory({
1121
+ sid: "-u1putn",
1122
+ fn: () => or(...routes.map((route) => route.$isPending)),
1123
+ name: "$isPending",
1124
+ method: "or"
1125
+ })
1218
1126
  });
1219
- const virtual = createVirtualRoute($isPending);
1220
1127
  sample({
1221
1128
  and: [{
1222
1129
  clock: routes.map((route) => route.$isOpened),
1223
1130
  filter: withFactory({
1224
- sid: "6pispd",
1131
+ sid: "76kf3k",
1225
1132
  fn: () => or(...routes.map((route) => route.$isOpened)),
1226
1133
  name: "filter",
1227
1134
  method: "or"
@@ -1230,16 +1137,16 @@ function group(routes) {
1230
1137
  target: virtual.open
1231
1138
  }],
1232
1139
  or: {
1233
- sid: "-xn8czd"
1140
+ sid: "-xmoke0"
1234
1141
  }
1235
1142
  });
1236
1143
  sample({
1237
1144
  and: [{
1238
1145
  clock: routes.map((route) => route.$isOpened),
1239
1146
  filter: withFactory({
1240
- sid: "a0u5gq",
1147
+ sid: "ahvrux",
1241
1148
  fn: () => not(withFactory({
1242
- sid: "xb4bx2",
1149
+ sid: "xs5yb9",
1243
1150
  fn: () => or(...routes.map((route) => route.$isOpened)),
1244
1151
  name: "fn",
1245
1152
  method: "or"
@@ -1251,7 +1158,7 @@ function group(routes) {
1251
1158
  target: virtual.close
1252
1159
  }],
1253
1160
  or: {
1254
- sid: "-x7u4d9"
1161
+ sid: "-x7abrw"
1255
1162
  }
1256
1163
  });
1257
1164
  return virtual;
@@ -1262,6 +1169,5 @@ export {
1262
1169
  createRouter,
1263
1170
  createRouterControls,
1264
1171
  createVirtualRoute,
1265
- group,
1266
- parameters
1172
+ group
1267
1173
  };
package/package.json CHANGED
@@ -5,7 +5,7 @@
5
5
  "registry": "https://registry.npmjs.org/"
6
6
  },
7
7
  "private": false,
8
- "version": "0.10.1",
8
+ "version": "0.11.0",
9
9
  "description": "Router with power of effector",
10
10
  "keywords": [
11
11
  "effector",
@@ -49,10 +49,11 @@
49
49
  },
50
50
  "devDependencies": {
51
51
  "@types/history": "^4.7.11",
52
- "query-string": "^9.1.1"
52
+ "query-string": "^9.1.1",
53
+ "zod": "^3.25.71"
53
54
  },
54
55
  "dependencies": {
55
- "@argon-router/paths": "^0.10.0"
56
+ "@argon-router/paths": "^0.11.0"
56
57
  },
57
- "gitHead": "aacf3ea0642e3c732e2721bc409ed9fba3a4b8a1"
58
+ "gitHead": "0180f75dbbc73a123e706ff48961f8e57d57ce65"
58
59
  }