@argon-router/core 0.9.0 → 0.10.1

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");const r={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 n(e,a){for(const t in a){const n=a[t];if(Array.isArray(n)&&(!e[t]||JSON.stringify(n)!==e[t]))return!1;switch(typeof n){case"number":if(!e[t]||n.toString()!==e[t])return!1;break;case"object":if(!e[t]||JSON.stringify(n)!==e[t])return!1;break;case"string":if(!e[t]||n!==e[t])return!1;break;case"boolean":if(!e[t]||!["0","1","false","true"].includes(e[t]))return!1}switch(n){case r.any:if(!e[t])return!1;break;case r.string:if(!e[t]||Array.isArray(e[t]))return!1;break;case r.array:if(!e[t]||!Array.isArray(e[t]))return!1;break;case r.number:if(!e[t]||Array.isArray(e[t])||isNaN(parseInt(e[t]))&&isNaN(parseFloat(e[t])))return!1;break;case r.boolean:if(!e[t]||Array.isArray(e[t])||!["0","1","false","true"].includes(e[t]))return!1}}return!0}function s(a){let{$query:r,navigate:t}=a;return o({$activeRoutes:e.createStore([],{name:"$activeRoutes",sid:"7ol7tr"}),$query:r,navigate:t})}function o(a){let{$activeRoutes:s,$query:o,navigate:i}=a;return a=>{const{parameters:c,forRoutes:l}=a,p=e.createStore(!1,{name:"$entered",sid:"-okbvx4"}),u=e.createEvent({name:"entered",sid:"-1bbi51"}),d=e.createEvent({name:"exited",sid:"-lw34uy"}),m=e.createEvent({name:"exit",sid:"5l9ghz"}),f=e.createEvent({name:"changeEntered",sid:"en4cc0"});return e.sample({and:[{clock:f,target:p}],or:{sid:"-gssa85"}}),e.sample({and:[{source:{activeRoutes:s,query:o},filter:e=>{let{activeRoutes:a,query:r}=e;return(!l||t(l,a))&&n(r,c)},fn:e=>{let{query:a}=e;return function(e,a){const t={};for(const n in a){const s=a[n],o=e[n];if(Array.isArray(s)){const a=e[n];t[n]=a;continue}switch(typeof s){case"number":t[n]=isNaN(parseInt(o))?parseFloat(o):parseInt(o);break;case"object":t[n]=JSON.parse(o);break;case"string":t[n]=o;case"boolean":t[n]="1"===o||"true"===o}switch(s){case r.any:case r.string:case r.array:t[n]=e[n];break;case r.number:{const a=e[n];t[n]=isNaN(parseInt(a))?parseFloat(a):parseInt(a);break}case r.boolean:{const a=e[n];t[n]="1"===a||"true"===a;break}}}return t}(a,c)},target:[u,f.prepend(()=>!0)]}],or:{sid:"-gehmsr"}}),e.sample({and:[{source:{activeRoutes:s,query:o,entered:p},filter:e=>{let{activeRoutes:a,query:r,entered:s}=e;return s&&!((!l||t(l,a))&&n(r,c))},target:[d.prepend(()=>{}),f.prepend(()=>!1)]}],or:{sid:"-fxzszx"}}),e.sample({and:[{clock:m,source:o,fn:(e,a)=>{if(a&&a.ignoreParams){const r={};for(const t of a.ignoreParams)e[t]&&(r[t]=e[t]);return{query:r}}return{query:{}}},target:i}],or:{sid:"-fer08a"}}),{entered:u,exited:d,exit:m}}}function i(e){return a=>{const r=a.split("/").map(e=>e.trim()).filter(e=>""!==e);let t=null;function n(e,a){t||(t={}),t[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:t,genericProps:o,required:i}=a.payload;if(t){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>=(t.max??1/0))break}if(i.length<(t.min??0))return null;if(r.length>0&&!e[s+1])return null;n(a.name,i);break}const c=r.shift();if(i&&!c)return null;if(!c){n(a.name,void 0);continue}switch(null==o?void 0:o.type){case"number":if(isNaN(+c))return null;n(a.name,+c);break;case"union":if(!o.items.includes(c))return null;n(a.name,c);break;default:n(a.name,c)}}}}return r.length>0?null:{path:a,params:t}}}function c(e){if(!e)return null;const a=e[1];let r,t,n;for(const s of e.slice(2))s&&(s.includes("<")?r=s.replaceAll(/\s/g,"").replace("<","").replace(">",""):(s.includes("{")&&(t=s.replace("{","").replace("}","").split(",").map(e=>parseInt(e))),["*","?","+"].includes(s)&&(n=s)));return{name:a,genericProps:r,arrayProps:t,modificator:n}}function l(e){return a=>{const r=[];if(0===e.length)return"/";for(const t of e)switch(t.type){case"const":r.push(t.name);break;case"parameter":if(!a[t.name])continue;if(Array.isArray(a[t.name]))for(const e of a[t.name])r.push(e.toString());else r.push(a[t.name].toString())}return`/${r.join("/")}`}}function p(){const r=e.createStore(null,{and:{serialize:"ignore"},name:"$history",sid:"-ld7lzl"}),t=e.createStore({query:{},path:null},{name:"$locationState",sid:"-4u3w85"}),n=t.map(e=>e.query),o=t.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"}),u=e.createEvent({name:"locationUpdated",sid:"lkzldx"}),d=e.attach({and:{source:r,effect:(e,r)=>{let{path:t,query:n,replace:s}=r;if(!e)throw new Error("history not found");const o={pathname:t,search:`?${a.stringify(n)}`};s?e.replace(o):e.push(o)}},or:{name:"navigateFx",sid:"-ov1xn7"}}),m=e.createEffect(r=>{const t=e.scopeBind(u);if(t({pathname:r.location.pathname,query:{...a.parse(r.location.search)}}),!r)throw new Error;r.listen(e=>{let{location:r}=e;t({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:u,fn:e=>({path:e.pathname,query:e.query}),target:t}],or:{sid:"i3x4a"}}),e.sample({and:[{clock:c,source:o,fn:(e,a)=>({path:e,...a}),target:d}],or:{sid:"ylqx4"}}),{$history:r,$locationState:t,$query:n,$path:o,setHistory:i,navigate:c,back:l,forward:p,locationUpdated:u,trackQuery:s({$query:n,navigate:c})}}exports.chainRoute=function(a){const{route:r,beforeOpen:t,openOn:n,cancelOn:s}=a;let o;const i=e.createEffect(()=>null==o?void 0:o(),{name:"waitForAsyncBundleFx",sid:"-utsi21"}),c=e.createEffect(async e=>{await i();for(const a of[].concat(t))await a(e)},{name:"openFx",sid:"-kgdclv"}),l=function(a){const r=e.createStore(null,{name:"$params",sid:"-grvyb1"}),t=e.createStore(!1,{name:"$isOpened",sid:"-w4cbyq"}),n=a,s=e.createEvent({name:"open",sid:"8yat5e"}),o=e.createEvent({name:"opened",sid:"-rsfhnq"}),i=e.createEvent({name:"openedOnServer",sid:"m42ioq"}),c=e.createEvent({name:"openedOnClient",sid:"-bstrdb"}),l=e.createEvent({name:"close",sid:"41ihvs"}),p=e.createEvent({name:"closed",sid:"vdm6z6"}),u=e.createEvent({name:"cancelled",sid:"-r20ekt"});return e.sample({and:[{clock:s,target:o}],or:{sid:"-ukycs8"}}),e.split({and:[{source:o,match:()=>"undefined"==typeof window?"server":"client",cases:{server:i,client:c}}],or:{sid:"-u6npcu"}}),e.sample({and:[{clock:l,target:p}],or:{sid:"-tq5vk0"}}),e.sample({and:[{clock:[o.map(()=>!0),p.map(()=>!1)],target:t}],or:{sid:"-tnewl7"}}),{$params:r,$isOpened:t,$isPending:n,open:s,opened:o,openedOnClient:c,openedOnServer:i,close:l,closed:p,cancelled:u,path:null,"@@unitShape":()=>({params:r,isOpened:t,isPending:n,onOpen:s})}}(c.pending);return e.sample({and:[{clock:r.opened,target:c}],or:{sid:"102heu"}}),e.sample({and:[{clock:r.opened,fn:e=>e&&"params"in e?e.params:null,target:l.$params}],or:{sid:"12tgdn"}}),n&&e.sample({and:[{clock:n,source:{params:l.$params},fn:e=>{let{params:a}=e;return{params:a}},target:l.open}],or:{sid:"1jba87"}}),s&&(e.sample({and:[{clock:[r.closed].concat(s),target:l.close}],or:{sid:"1zt411"}}),e.sample({and:[{clock:[].concat(s),target:l.cancelled}],or:{sid:"22k2zu"}})),Object.assign(l,{internal:{setAsyncImport:e=>o=e}})},exports.createRoute=function(a){let r;const t=e.createEffect(()=>null==r?void 0:r(),{name:"waitForAsyncBundleFx",sid:"1y76ms"}),n=e.createEffect(async()=>{for(const e of a.beforeOpen??[])await e()},{name:"beforeOpenFx",sid:"-65tb76"}),s=e.createEffect(async e=>{await t(),await n();const r=a.parent;return r&&await r.internal.openFx({...e??{params:{}},navigate:!1}),e},{name:"openFx",sid:"p3u4q7"}),o=e.createStore({},{name:"$params",sid:"-a34rm3"}),i=e.createStore(!1,{name:"$isOpened",sid:"7m6f5g"}),c=s.pending,l=e.createEvent({name:"open",sid:"ur5fa6"}),p=e.createEvent({name:"close",sid:"-k33yie"}),u=e.createEvent({name:"opened",sid:"-nt8hns"}),d=e.createEvent({name:"openedOnServer",sid:"hbjexo"}),m=e.createEvent({name:"openedOnClient",sid:"h92wzn"}),f=e.createEvent({name:"navigated",sid:"-8amrhe"}),y=e.createEvent({name:"closed",sid:"-pql6th"});e.sample({and:[{clock:l,target:s}],or:{sid:"ymah4t"}});const h={};return e.sample({and:[{clock:f,fn:e=>e&&"params"in e?{...e.params}:h,target:o}],or:{sid:"z1opqx"}}),e.split({and:[{source:f,match:()=>"undefined"==typeof window?"server":"client",cases:{server:d,client:m}}],or:{sid:"-zha4na"}}),e.sample({and:[{clock:[m,d],target:u}],or:{sid:"-z08i93"}}),e.sample({and:[{clock:p,target:y}],or:{sid:"-yxhjaa"}}),e.sample({and:[{clock:[u.map(()=>!0),y.map(()=>!1)],target:i}],or:{sid:"-yj6vuw"}}),{$params:o,$isOpened:i,$isPending:c,open:l,closed:y,opened:u,openedOnClient:m,openedOnServer:d,...a,internal:{navigated:f,close:p,openFx:s,setAsyncImport:e=>r=e},"@@unitShape":()=>({params:o,isPending:c,isOpened:i,onOpen:l})}},exports.createRouter=function(a){const{base:r="/",routes:t}=a,{$path:n,$query:s,back:u,forward:d,navigate:m,setHistory:f,locationUpdated:y}=p(),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 n="/"===r?t.join(""):[r,...t].join(""),{build:s,parse:o}=function(e){const a=[],r=/:(\w+)(<[\s?\w|]+>)?({\d+\,\d+})?([+*?])?/,t=e.split("/").filter(Boolean);for(let n=0;n<t.length;n++){const s=t[n];if(!s)continue;const o=c(s.match(r));if(!o){a.push({type:"const",name:s,payload:void 0});continue}const{arrayProps:i,genericProps:l,modificator:p,name:u}=o;if(!u)throw new Error(`Invalid path: "${e}". Name for argument must be provided`);const d={type:"parameter",name:u,payload:{required:!0}};switch(l&&"number"===l&&(d.payload.genericProps={type:"number"}),l&&l.includes("|")&&(d.payload.genericProps={type:"union",items:l.split("|")}),p){case"*":d.payload.arrayProps={};break;case"+":d.payload.arrayProps={min:1};break;case"?":d.payload.required=!1}i&&(d.payload.arrayProps={...d.payload.arrayProps,min:i[0],max:i[1]}),a.push(d)}return{parse:i(a),build:l(a)}}(n);return{route:e,path:n,build:s,parse:o}}),g=n.map(e=>{const a=[];if(!e)return a;for(const{route:r,parse:t}of h)t(e)&&a.push(r);return a}),v=e.attach({and:{source:{query:s,path:n},effect:async a=>{let{query:r,path:t}=a;for(const{route:n,parse:s}of h){const a=s(t),[o,i]=[e.scopeBind(n.internal.close),e.scopeBind(n.internal.navigated)];a?i({query:r,params:a.params}):o()}}},or:{name:"openRoutesByPathFx",sid:"-3zl7vq"}});for(const{route:o,build:i}of h)e.sample({and:[{clock:o.internal.openFx.doneData,filter:e=>!1!==(null==e?void 0:e.navigate),fn:e=>({path:i(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:n,$activeRoutes:g,back:u,forward:d,navigate:m,routes:t,setHistory:f,mappedRoutes:h,trackQuery:o({$activeRoutes:g,$query:s,navigate:m}),"@@unitShape":()=>({query:s,path:n,activeRoutes:g,onBack:u,onForward:d,onNavigate:m})}},exports.createRouterControls=p,exports.parameters=r;
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;
package/dist/index.d.ts CHANGED
@@ -179,6 +179,28 @@ export declare function createRouter(config: RouterConfig): Router;
179
179
  */
180
180
  export declare function createRouterControls(): RouterControls;
181
181
 
182
+ export declare function createVirtualRoute<T>(pending?: Store<boolean>): VirtualRoute<T>;
183
+
184
+ /**
185
+ * @description Create virtual route which opens when some passed routes is opened. Closes if all passed routes are closed.
186
+ * @link https://movpushmov.dev/argon-router/core/group.html
187
+ * @returns VirtualRoute
188
+ * @example ```ts
189
+ * import { group, createRoute } from '@argon-router/core';
190
+ * import { createEvent, createEffect } from 'effector';
191
+ *
192
+ * const signInRoute = createRoute({ path: '/auth/sign-in' });
193
+ * const signUpRoute = createRoute({ path: '/auth/sign-up' });
194
+ * const authorizationRoute = group([signInRoute, signUpRoute]);
195
+ *
196
+ * signInRoute.open(); // authorizationRoute.$isOpened —> true
197
+ * signUpRoute.open(); // authorizationRoute.$isOpened —> true
198
+ * signInRoute.close(); // authorizationRoute.$isOpened —> true
199
+ * signUpRoute.close(); // authorizationRoute.$isOpened —> false
200
+ * ```
201
+ */
202
+ export declare function group(routes: Route<any>[]): VirtualRoute<void>;
203
+
182
204
  declare type LocationState = {
183
205
  path: string;
184
206
  query: Query;
package/dist/index.js CHANGED
@@ -1,19 +1,8 @@
1
- import { createEffect, createStore, createEvent, sample, split, attach, scopeBind } from "effector";
1
+ import { createEffect, createStore, createEvent, attach, sample, split, scopeBind, withFactory } from "effector";
2
2
  import queryString from "query-string";
3
+ import { or, not } from "patronum";
3
4
  function createRoute(config) {
4
5
  let asyncImport;
5
- const waitForAsyncBundleFx = createEffect(() => asyncImport == null ? void 0 : asyncImport(), {
6
- name: "waitForAsyncBundleFx",
7
- sid: "1y76ms"
8
- });
9
- const beforeOpenFx = createEffect(async () => {
10
- for (const fx of config.beforeOpen ?? []) {
11
- await fx();
12
- }
13
- }, {
14
- name: "beforeOpenFx",
15
- sid: "-65tb76"
16
- });
17
6
  const openFx = createEffect(async (payload) => {
18
7
  await waitForAsyncBundleFx();
19
8
  await beforeOpenFx();
@@ -29,58 +18,92 @@ function createRoute(config) {
29
18
  return payload;
30
19
  }, {
31
20
  name: "openFx",
32
- sid: "p3u4q7"
21
+ sid: "awhgwd"
33
22
  });
34
23
  const $params = createStore({}, {
35
24
  name: "$params",
36
- sid: "-a34rm3"
25
+ sid: "-oahffx"
37
26
  });
38
27
  const $isOpened = createStore(false, {
39
28
  name: "$isOpened",
40
- sid: "7m6f5g"
29
+ sid: "-6l68oe"
41
30
  });
42
31
  const $isPending = openFx.pending;
43
32
  const open = createEvent({
44
33
  name: "open",
45
- sid: "ur5fa6"
34
+ sid: "gjsrgc"
46
35
  });
47
36
  const close = createEvent({
48
37
  name: "close",
49
- sid: "-k33yie"
38
+ sid: "-yagmc8"
50
39
  });
51
40
  const opened = createEvent({
52
41
  name: "opened",
53
- sid: "-nt8hns"
42
+ sid: "x0iwhi"
54
43
  });
55
44
  const openedOnServer = createEvent({
56
45
  name: "openedOnServer",
57
- sid: "hbjexo"
46
+ sid: "346r3u"
58
47
  });
59
48
  const openedOnClient = createEvent({
60
49
  name: "openedOnClient",
61
- sid: "h92wzn"
50
+ sid: "31q95t"
62
51
  });
63
52
  const navigated = createEvent({
64
53
  name: "navigated",
65
- sid: "-8amrhe"
54
+ sid: "-t30l0x"
66
55
  });
67
56
  const closed = createEvent({
68
57
  name: "closed",
69
- sid: "-pql6th"
58
+ sid: "uue4ce"
59
+ });
60
+ const waitForAsyncBundleFx = createEffect(() => asyncImport == null ? void 0 : asyncImport(), {
61
+ name: "waitForAsyncBundleFx",
62
+ sid: "-nml5ho"
70
63
  });
64
+ const beforeOpenFx = createEffect(async () => {
65
+ for (const fx of config.beforeOpen ?? []) {
66
+ await fx();
67
+ }
68
+ }, {
69
+ name: "beforeOpenFx",
70
+ sid: "-vqlnbm"
71
+ });
72
+ const navigatedFx = attach({
73
+ and: {
74
+ effect: openFx
75
+ },
76
+ or: {
77
+ name: "navigatedFx",
78
+ sid: "a4yadj"
79
+ }
80
+ });
81
+ const defaultParams = {};
71
82
  sample({
72
83
  and: [{
73
84
  clock: open,
74
85
  target: openFx
75
86
  }],
76
87
  or: {
77
- sid: "ymah4t"
88
+ sid: "ynxuww"
78
89
  }
79
90
  });
80
- const defaultParams = {};
81
91
  sample({
82
92
  and: [{
83
93
  clock: navigated,
94
+ fn: (payload) => ({
95
+ navigate: false,
96
+ ...payload
97
+ }),
98
+ target: navigatedFx
99
+ }],
100
+ or: {
101
+ sid: "z28ica"
102
+ }
103
+ });
104
+ sample({
105
+ and: [{
106
+ clock: navigatedFx.doneData,
84
107
  fn: (payload) => {
85
108
  if (!payload) {
86
109
  return defaultParams;
@@ -92,12 +115,22 @@ function createRoute(config) {
92
115
  target: $params
93
116
  }],
94
117
  or: {
95
- sid: "z1opqx"
118
+ sid: "z5j9wg"
119
+ }
120
+ });
121
+ sample({
122
+ and: [{
123
+ clock: navigatedFx.failData,
124
+ fn: () => defaultParams,
125
+ target: $params
126
+ }],
127
+ or: {
128
+ sid: "-z1vw16"
96
129
  }
97
130
  });
98
131
  split({
99
132
  and: [{
100
- source: navigated,
133
+ source: navigatedFx.doneData,
101
134
  match: () => typeof window === "undefined" ? "server" : "client",
102
135
  cases: {
103
136
  server: openedOnServer,
@@ -105,7 +138,7 @@ function createRoute(config) {
105
138
  }
106
139
  }],
107
140
  or: {
108
- sid: "-zha4na"
141
+ sid: "-yyl4h0"
109
142
  }
110
143
  });
111
144
  sample({
@@ -114,7 +147,7 @@ function createRoute(config) {
114
147
  target: opened
115
148
  }],
116
149
  or: {
117
- sid: "-z08i93"
150
+ sid: "-yhji2t"
118
151
  }
119
152
  });
120
153
  sample({
@@ -123,7 +156,7 @@ function createRoute(config) {
123
156
  target: closed
124
157
  }],
125
158
  or: {
126
- sid: "-yxhjaa"
159
+ sid: "-y38unf"
127
160
  }
128
161
  });
129
162
  sample({
@@ -132,7 +165,7 @@ function createRoute(config) {
132
165
  target: $isOpened
133
166
  }],
134
167
  or: {
135
- sid: "-yj6vuw"
168
+ sid: "-y0hvom"
136
169
  }
137
170
  });
138
171
  return {
@@ -302,7 +335,7 @@ function trackQueryControlsFactory(_ref) {
302
335
  return trackQueryFactory({
303
336
  $activeRoutes: createStore([], {
304
337
  name: "$activeRoutes",
305
- sid: "7ol7tr"
338
+ sid: "85ms46"
306
339
  }),
307
340
  $query,
308
341
  navigate
@@ -321,23 +354,23 @@ function trackQueryFactory(_ref2) {
321
354
  } = config;
322
355
  const $entered = createStore(false, {
323
356
  name: "$entered",
324
- sid: "-okbvx4"
357
+ sid: "-mo5ecc"
325
358
  });
326
359
  const entered = createEvent({
327
360
  name: "entered",
328
- sid: "-1bbi51"
361
+ sid: "kuzfr"
329
362
  });
330
363
  const exited = createEvent({
331
364
  name: "exited",
332
- sid: "-lw34uy"
365
+ sid: "-jzwna6"
333
366
  });
334
367
  const exit = createEvent({
335
368
  name: "exit",
336
- sid: "5l9ghz"
369
+ sid: "7hfy2r"
337
370
  });
338
371
  const changeEntered = createEvent({
339
372
  name: "changeEntered",
340
- sid: "en4cc0"
373
+ sid: "qh8w6v"
341
374
  });
342
375
  sample({
343
376
  and: [{
@@ -345,7 +378,7 @@ function trackQueryFactory(_ref2) {
345
378
  target: $entered
346
379
  }],
347
380
  or: {
348
- sid: "-gssa85"
381
+ sid: "-gf1fe4"
349
382
  }
350
383
  });
351
384
  sample({
@@ -370,7 +403,7 @@ function trackQueryFactory(_ref2) {
370
403
  target: [entered, changeEntered.prepend(() => true)]
371
404
  }],
372
405
  or: {
373
- sid: "-gehmsr"
406
+ sid: "-gcagfb"
374
407
  }
375
408
  });
376
409
  sample({
@@ -391,7 +424,7 @@ function trackQueryFactory(_ref2) {
391
424
  target: [exited.prepend(() => void 0), changeEntered.prepend(() => false)]
392
425
  }],
393
426
  or: {
394
- sid: "-fxzszx"
427
+ sid: "-fvsmmh"
395
428
  }
396
429
  });
397
430
  sample({
@@ -417,7 +450,7 @@ function trackQueryFactory(_ref2) {
417
450
  target: navigate
418
451
  }],
419
452
  or: {
420
- sid: "-fer08a"
453
+ sid: "-f105e9"
421
454
  }
422
455
  });
423
456
  return {
@@ -980,43 +1013,51 @@ function createRouter(config) {
980
1013
  })
981
1014
  };
982
1015
  }
983
- function createVirtualRoute(pending) {
1016
+ 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
+ });
984
1025
  const $params = createStore(null, {
985
1026
  name: "$params",
986
- sid: "-grvyb1"
1027
+ sid: "-ftspin"
987
1028
  });
988
1029
  const $isOpened = createStore(false, {
989
1030
  name: "$isOpened",
990
- sid: "-w4cbyq"
1031
+ sid: "-v6936c"
991
1032
  });
992
1033
  const $isPending = pending;
993
1034
  const open = createEvent({
994
1035
  name: "open",
995
- sid: "8yat5e"
1036
+ sid: "juc47v"
996
1037
  });
997
1038
  const opened = createEvent({
998
1039
  name: "opened",
999
- sid: "-rsfhnq"
1040
+ sid: "-quc8vc"
1000
1041
  });
1001
1042
  const openedOnServer = createEvent({
1002
1043
  name: "openedOnServer",
1003
- sid: "m42ioq"
1044
+ sid: "n25rh4"
1004
1045
  });
1005
1046
  const openedOnClient = createEvent({
1006
1047
  name: "openedOnClient",
1007
- sid: "-bstrdb"
1048
+ sid: "-auqikx"
1008
1049
  });
1009
1050
  const close = createEvent({
1010
1051
  name: "close",
1011
- sid: "41ihvs"
1052
+ sid: "4zlqo6"
1012
1053
  });
1013
1054
  const closed = createEvent({
1014
1055
  name: "closed",
1015
- sid: "vdm6z6"
1056
+ sid: "wbpfrk"
1016
1057
  });
1017
1058
  const cancelled = createEvent({
1018
1059
  name: "cancelled",
1019
- sid: "-r20ekt"
1060
+ sid: "-q3x5sf"
1020
1061
  });
1021
1062
  sample({
1022
1063
  and: [{
@@ -1024,7 +1065,7 @@ function createVirtualRoute(pending) {
1024
1065
  target: opened
1025
1066
  }],
1026
1067
  or: {
1027
- sid: "-ukycs8"
1068
+ sid: "-u8b34x"
1028
1069
  }
1029
1070
  });
1030
1071
  split({
@@ -1037,7 +1078,7 @@ function createVirtualRoute(pending) {
1037
1078
  }
1038
1079
  }],
1039
1080
  or: {
1040
- sid: "-u6npcu"
1081
+ sid: "-u5k464"
1041
1082
  }
1042
1083
  });
1043
1084
  sample({
@@ -1046,7 +1087,7 @@ function createVirtualRoute(pending) {
1046
1087
  target: closed
1047
1088
  }],
1048
1089
  or: {
1049
- sid: "-tq5vk0"
1090
+ sid: "-tp2ada"
1050
1091
  }
1051
1092
  });
1052
1093
  sample({
@@ -1055,7 +1096,7 @@ function createVirtualRoute(pending) {
1055
1096
  target: $isOpened
1056
1097
  }],
1057
1098
  or: {
1058
- sid: "-tnewl7"
1099
+ sid: "-tarmxw"
1059
1100
  }
1060
1101
  });
1061
1102
  return {
@@ -1089,7 +1130,7 @@ function chainRoute(props) {
1089
1130
  let asyncImport;
1090
1131
  const waitForAsyncBundleFx = createEffect(() => asyncImport == null ? void 0 : asyncImport(), {
1091
1132
  name: "waitForAsyncBundleFx",
1092
- sid: "-utsi21"
1133
+ sid: "-tvp99n"
1093
1134
  });
1094
1135
  const openFx = createEffect(async (payload) => {
1095
1136
  await waitForAsyncBundleFx();
@@ -1098,7 +1139,7 @@ function chainRoute(props) {
1098
1139
  }
1099
1140
  }, {
1100
1141
  name: "openFx",
1101
- sid: "-kgdclv"
1142
+ sid: "-9kc1je"
1102
1143
  });
1103
1144
  const virtualRoute = createVirtualRoute(openFx.pending);
1104
1145
  sample({
@@ -1107,7 +1148,7 @@ function chainRoute(props) {
1107
1148
  target: openFx
1108
1149
  }],
1109
1150
  or: {
1110
- sid: "102heu"
1151
+ sid: "1162lk"
1111
1152
  }
1112
1153
  });
1113
1154
  sample({
@@ -1117,7 +1158,7 @@ function chainRoute(props) {
1117
1158
  target: virtualRoute.$params
1118
1159
  }],
1119
1160
  or: {
1120
- sid: "12tgdn"
1161
+ sid: "13x1kd"
1121
1162
  }
1122
1163
  });
1123
1164
  if (openOn) {
@@ -1138,7 +1179,7 @@ function chainRoute(props) {
1138
1179
  target: virtualRoute.open
1139
1180
  }],
1140
1181
  or: {
1141
- sid: "1jba87"
1182
+ sid: "1kevex"
1142
1183
  }
1143
1184
  });
1144
1185
  }
@@ -1149,7 +1190,7 @@ function chainRoute(props) {
1149
1190
  target: virtualRoute.close
1150
1191
  }],
1151
1192
  or: {
1152
- sid: "1zt411"
1193
+ sid: "20wp7r"
1153
1194
  }
1154
1195
  });
1155
1196
  sample({
@@ -1158,7 +1199,7 @@ function chainRoute(props) {
1158
1199
  target: virtualRoute.cancelled
1159
1200
  }],
1160
1201
  or: {
1161
- sid: "22k2zu"
1202
+ sid: "2f7cn5"
1162
1203
  }
1163
1204
  });
1164
1205
  }
@@ -1168,10 +1209,59 @@ function chainRoute(props) {
1168
1209
  }
1169
1210
  });
1170
1211
  }
1212
+ function group(routes) {
1213
+ const $isPending = withFactory({
1214
+ sid: "-uirglg",
1215
+ fn: () => or(...routes.map((route) => route.$isPending)),
1216
+ name: "$isPending",
1217
+ method: "or"
1218
+ });
1219
+ const virtual = createVirtualRoute($isPending);
1220
+ sample({
1221
+ and: [{
1222
+ clock: routes.map((route) => route.$isOpened),
1223
+ filter: withFactory({
1224
+ sid: "6pispd",
1225
+ fn: () => or(...routes.map((route) => route.$isOpened)),
1226
+ name: "filter",
1227
+ method: "or"
1228
+ }),
1229
+ fn: () => void 0,
1230
+ target: virtual.open
1231
+ }],
1232
+ or: {
1233
+ sid: "-xn8czd"
1234
+ }
1235
+ });
1236
+ sample({
1237
+ and: [{
1238
+ clock: routes.map((route) => route.$isOpened),
1239
+ filter: withFactory({
1240
+ sid: "a0u5gq",
1241
+ fn: () => not(withFactory({
1242
+ sid: "xb4bx2",
1243
+ fn: () => or(...routes.map((route) => route.$isOpened)),
1244
+ name: "fn",
1245
+ method: "or"
1246
+ })),
1247
+ name: "filter",
1248
+ method: "not"
1249
+ }),
1250
+ fn: () => void 0,
1251
+ target: virtual.close
1252
+ }],
1253
+ or: {
1254
+ sid: "-x7u4d9"
1255
+ }
1256
+ });
1257
+ return virtual;
1258
+ }
1171
1259
  export {
1172
1260
  chainRoute,
1173
1261
  createRoute,
1174
1262
  createRouter,
1175
1263
  createRouterControls,
1264
+ createVirtualRoute,
1265
+ group,
1176
1266
  parameters
1177
1267
  };
package/package.json CHANGED
@@ -5,7 +5,7 @@
5
5
  "registry": "https://registry.npmjs.org/"
6
6
  },
7
7
  "private": false,
8
- "version": "0.9.0",
8
+ "version": "0.10.1",
9
9
  "description": "Router with power of effector",
10
10
  "keywords": [
11
11
  "effector",
@@ -52,7 +52,7 @@
52
52
  "query-string": "^9.1.1"
53
53
  },
54
54
  "dependencies": {
55
- "@argon-router/paths": "^0.9.0"
55
+ "@argon-router/paths": "^0.10.0"
56
56
  },
57
- "gitHead": "fab0cd752c30cf142c168308596b2dcf2c664da2"
57
+ "gitHead": "aacf3ea0642e3c732e2721bc409ed9fba3a4b8a1"
58
58
  }