@argon-router/core 0.9.0 → 0.10.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");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:p}=a,l=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:l}],or:{sid:"-gf1fe4"}}),e.sample({and:[{source:{activeRoutes:r,query:o},filter:e=>{let{activeRoutes:a,query:r}=e;return(!p||t(p,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:l},filter:e=>{let{activeRoutes:a,query:r,entered:n}=e;return n&&!((!p||t(p,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 p(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 l(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"}),p=e.createEvent({name:"back",sid:"bxy8rt"}),l=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:p,forward:l,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"}),p=e.createEvent({name:"close",sid:"4zlqo6"}),l=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:p,target:l}],or:{sid:"-tp2ada"}}),e.sample({and:[{clock:[o.map(()=>!0),l.map(()=>!1)],target:n}],or:{sid:"-tarmxw"}}),{$params:r,$isOpened:n,$isPending:t,open:s,opened:o,openedOnClient:c,openedOnServer:i,close:p,closed:l,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"}),p=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:p.$params}],or:{sid:"13x1kd"}}),t&&e.sample({and:[{clock:t,source:{params:p.$params},fn:e=>{let{params:a}=e;return{params:a}},target:p.open}],or:{sid:"1kevex"}}),s&&(e.sample({and:[{clock:[r.closed].concat(s),target:p.close}],or:{sid:"20wp7r"}}),e.sample({and:[{clock:[].concat(s),target:p.cancelled}],or:{sid:"2f7cn5"}})),Object.assign(p,{internal:{setAsyncImport:e=>o=e}})},exports.createRoute=function(a){let r;const n=e.createEffect(()=>null==r?void 0:r(),{name:"waitForAsyncBundleFx",sid:"1y76ms"}),t=e.createEffect(async()=>{for(const e of a.beforeOpen??[])await e()},{name:"beforeOpenFx",sid:"-65tb76"}),s=e.createEffect(async e=>{await n(),await t();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,p=e.createEvent({name:"open",sid:"ur5fa6"}),l=e.createEvent({name:"close",sid:"-k33yie"}),d=e.createEvent({name:"opened",sid:"-nt8hns"}),u=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:p,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:u,client:m}}],or:{sid:"-zha4na"}}),e.sample({and:[{clock:[m,u],target:d}],or:{sid:"-z08i93"}}),e.sample({and:[{clock:l,target:y}],or:{sid:"-yxhjaa"}}),e.sample({and:[{clock:[d.map(()=>!0),y.map(()=>!1)],target:i}],or:{sid:"-yj6vuw"}}),{$params:o,$isOpened:i,$isPending:c,open:p,closed:y,opened:d,openedOnClient:m,openedOnServer:u,...a,internal:{navigated:f,close:l,openFx:s,setAsyncImport:e=>r=e},"@@unitShape":()=>({params:o,isPending:c,isOpened:i,onOpen:p})}},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(),h=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=p(s.match(r));if(!o){a.push({type:"const",name:s,payload:void 0});continue}const{arrayProps:i,genericProps:c,modificator:l,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("|")}),l){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:l(a)}}(t);return{route:e,path:t,build:s,parse:o}}),g=t.map(e=>{const a=[];if(!e)return a;for(const{route:r,parse:n}of h)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 h){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 h)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:g,back:o,forward:u,navigate:m,routes:n,setHistory:f,mappedRoutes:h,trackQuery:i({$activeRoutes:g,$query:s,navigate:m}),"@@unitShape":()=>({query:s,path:t,activeRoutes:g,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,5 +1,6 @@
1
- import { createEffect, createStore, createEvent, sample, split, attach, scopeBind } from "effector";
1
+ import { createEffect, createStore, createEvent, sample, split, attach, 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
6
  const waitForAsyncBundleFx = createEffect(() => asyncImport == null ? void 0 : asyncImport(), {
@@ -302,7 +303,7 @@ function trackQueryControlsFactory(_ref) {
302
303
  return trackQueryFactory({
303
304
  $activeRoutes: createStore([], {
304
305
  name: "$activeRoutes",
305
- sid: "7ol7tr"
306
+ sid: "85ms46"
306
307
  }),
307
308
  $query,
308
309
  navigate
@@ -321,23 +322,23 @@ function trackQueryFactory(_ref2) {
321
322
  } = config;
322
323
  const $entered = createStore(false, {
323
324
  name: "$entered",
324
- sid: "-okbvx4"
325
+ sid: "-mo5ecc"
325
326
  });
326
327
  const entered = createEvent({
327
328
  name: "entered",
328
- sid: "-1bbi51"
329
+ sid: "kuzfr"
329
330
  });
330
331
  const exited = createEvent({
331
332
  name: "exited",
332
- sid: "-lw34uy"
333
+ sid: "-jzwna6"
333
334
  });
334
335
  const exit = createEvent({
335
336
  name: "exit",
336
- sid: "5l9ghz"
337
+ sid: "7hfy2r"
337
338
  });
338
339
  const changeEntered = createEvent({
339
340
  name: "changeEntered",
340
- sid: "en4cc0"
341
+ sid: "qh8w6v"
341
342
  });
342
343
  sample({
343
344
  and: [{
@@ -345,7 +346,7 @@ function trackQueryFactory(_ref2) {
345
346
  target: $entered
346
347
  }],
347
348
  or: {
348
- sid: "-gssa85"
349
+ sid: "-gf1fe4"
349
350
  }
350
351
  });
351
352
  sample({
@@ -370,7 +371,7 @@ function trackQueryFactory(_ref2) {
370
371
  target: [entered, changeEntered.prepend(() => true)]
371
372
  }],
372
373
  or: {
373
- sid: "-gehmsr"
374
+ sid: "-gcagfb"
374
375
  }
375
376
  });
376
377
  sample({
@@ -391,7 +392,7 @@ function trackQueryFactory(_ref2) {
391
392
  target: [exited.prepend(() => void 0), changeEntered.prepend(() => false)]
392
393
  }],
393
394
  or: {
394
- sid: "-fxzszx"
395
+ sid: "-fvsmmh"
395
396
  }
396
397
  });
397
398
  sample({
@@ -417,7 +418,7 @@ function trackQueryFactory(_ref2) {
417
418
  target: navigate
418
419
  }],
419
420
  or: {
420
- sid: "-fer08a"
421
+ sid: "-f105e9"
421
422
  }
422
423
  });
423
424
  return {
@@ -980,43 +981,51 @@ function createRouter(config) {
980
981
  })
981
982
  };
982
983
  }
983
- function createVirtualRoute(pending) {
984
+ function createVirtualRoute() {
985
+ let pending = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : createStore(false, {
986
+ and: {
987
+ name: "pending",
988
+ sid: "r89aiv"
989
+ },
990
+ name: "pending",
991
+ sid: "r89aiv"
992
+ });
984
993
  const $params = createStore(null, {
985
994
  name: "$params",
986
- sid: "-grvyb1"
995
+ sid: "-ftspin"
987
996
  });
988
997
  const $isOpened = createStore(false, {
989
998
  name: "$isOpened",
990
- sid: "-w4cbyq"
999
+ sid: "-v6936c"
991
1000
  });
992
1001
  const $isPending = pending;
993
1002
  const open = createEvent({
994
1003
  name: "open",
995
- sid: "8yat5e"
1004
+ sid: "juc47v"
996
1005
  });
997
1006
  const opened = createEvent({
998
1007
  name: "opened",
999
- sid: "-rsfhnq"
1008
+ sid: "-quc8vc"
1000
1009
  });
1001
1010
  const openedOnServer = createEvent({
1002
1011
  name: "openedOnServer",
1003
- sid: "m42ioq"
1012
+ sid: "n25rh4"
1004
1013
  });
1005
1014
  const openedOnClient = createEvent({
1006
1015
  name: "openedOnClient",
1007
- sid: "-bstrdb"
1016
+ sid: "-auqikx"
1008
1017
  });
1009
1018
  const close = createEvent({
1010
1019
  name: "close",
1011
- sid: "41ihvs"
1020
+ sid: "4zlqo6"
1012
1021
  });
1013
1022
  const closed = createEvent({
1014
1023
  name: "closed",
1015
- sid: "vdm6z6"
1024
+ sid: "wbpfrk"
1016
1025
  });
1017
1026
  const cancelled = createEvent({
1018
1027
  name: "cancelled",
1019
- sid: "-r20ekt"
1028
+ sid: "-q3x5sf"
1020
1029
  });
1021
1030
  sample({
1022
1031
  and: [{
@@ -1024,7 +1033,7 @@ function createVirtualRoute(pending) {
1024
1033
  target: opened
1025
1034
  }],
1026
1035
  or: {
1027
- sid: "-ukycs8"
1036
+ sid: "-u8b34x"
1028
1037
  }
1029
1038
  });
1030
1039
  split({
@@ -1037,7 +1046,7 @@ function createVirtualRoute(pending) {
1037
1046
  }
1038
1047
  }],
1039
1048
  or: {
1040
- sid: "-u6npcu"
1049
+ sid: "-u5k464"
1041
1050
  }
1042
1051
  });
1043
1052
  sample({
@@ -1046,7 +1055,7 @@ function createVirtualRoute(pending) {
1046
1055
  target: closed
1047
1056
  }],
1048
1057
  or: {
1049
- sid: "-tq5vk0"
1058
+ sid: "-tp2ada"
1050
1059
  }
1051
1060
  });
1052
1061
  sample({
@@ -1055,7 +1064,7 @@ function createVirtualRoute(pending) {
1055
1064
  target: $isOpened
1056
1065
  }],
1057
1066
  or: {
1058
- sid: "-tnewl7"
1067
+ sid: "-tarmxw"
1059
1068
  }
1060
1069
  });
1061
1070
  return {
@@ -1089,7 +1098,7 @@ function chainRoute(props) {
1089
1098
  let asyncImport;
1090
1099
  const waitForAsyncBundleFx = createEffect(() => asyncImport == null ? void 0 : asyncImport(), {
1091
1100
  name: "waitForAsyncBundleFx",
1092
- sid: "-utsi21"
1101
+ sid: "-tvp99n"
1093
1102
  });
1094
1103
  const openFx = createEffect(async (payload) => {
1095
1104
  await waitForAsyncBundleFx();
@@ -1098,7 +1107,7 @@ function chainRoute(props) {
1098
1107
  }
1099
1108
  }, {
1100
1109
  name: "openFx",
1101
- sid: "-kgdclv"
1110
+ sid: "-9kc1je"
1102
1111
  });
1103
1112
  const virtualRoute = createVirtualRoute(openFx.pending);
1104
1113
  sample({
@@ -1107,7 +1116,7 @@ function chainRoute(props) {
1107
1116
  target: openFx
1108
1117
  }],
1109
1118
  or: {
1110
- sid: "102heu"
1119
+ sid: "1162lk"
1111
1120
  }
1112
1121
  });
1113
1122
  sample({
@@ -1117,7 +1126,7 @@ function chainRoute(props) {
1117
1126
  target: virtualRoute.$params
1118
1127
  }],
1119
1128
  or: {
1120
- sid: "12tgdn"
1129
+ sid: "13x1kd"
1121
1130
  }
1122
1131
  });
1123
1132
  if (openOn) {
@@ -1138,7 +1147,7 @@ function chainRoute(props) {
1138
1147
  target: virtualRoute.open
1139
1148
  }],
1140
1149
  or: {
1141
- sid: "1jba87"
1150
+ sid: "1kevex"
1142
1151
  }
1143
1152
  });
1144
1153
  }
@@ -1149,7 +1158,7 @@ function chainRoute(props) {
1149
1158
  target: virtualRoute.close
1150
1159
  }],
1151
1160
  or: {
1152
- sid: "1zt411"
1161
+ sid: "20wp7r"
1153
1162
  }
1154
1163
  });
1155
1164
  sample({
@@ -1158,7 +1167,7 @@ function chainRoute(props) {
1158
1167
  target: virtualRoute.cancelled
1159
1168
  }],
1160
1169
  or: {
1161
- sid: "22k2zu"
1170
+ sid: "2f7cn5"
1162
1171
  }
1163
1172
  });
1164
1173
  }
@@ -1168,10 +1177,59 @@ function chainRoute(props) {
1168
1177
  }
1169
1178
  });
1170
1179
  }
1180
+ function group(routes) {
1181
+ const $isPending = withFactory({
1182
+ sid: "-uirglg",
1183
+ fn: () => or(...routes.map((route) => route.$isPending)),
1184
+ name: "$isPending",
1185
+ method: "or"
1186
+ });
1187
+ const virtual = createVirtualRoute($isPending);
1188
+ sample({
1189
+ and: [{
1190
+ clock: routes.map((route) => route.$isOpened),
1191
+ filter: withFactory({
1192
+ sid: "6pispd",
1193
+ fn: () => or(...routes.map((route) => route.$isOpened)),
1194
+ name: "filter",
1195
+ method: "or"
1196
+ }),
1197
+ fn: () => void 0,
1198
+ target: virtual.open
1199
+ }],
1200
+ or: {
1201
+ sid: "-xn8czd"
1202
+ }
1203
+ });
1204
+ sample({
1205
+ and: [{
1206
+ clock: routes.map((route) => route.$isOpened),
1207
+ filter: withFactory({
1208
+ sid: "a0u5gq",
1209
+ fn: () => not(withFactory({
1210
+ sid: "xb4bx2",
1211
+ fn: () => or(...routes.map((route) => route.$isOpened)),
1212
+ name: "fn",
1213
+ method: "or"
1214
+ })),
1215
+ name: "filter",
1216
+ method: "not"
1217
+ }),
1218
+ fn: () => void 0,
1219
+ target: virtual.close
1220
+ }],
1221
+ or: {
1222
+ sid: "-x7u4d9"
1223
+ }
1224
+ });
1225
+ return virtual;
1226
+ }
1171
1227
  export {
1172
1228
  chainRoute,
1173
1229
  createRoute,
1174
1230
  createRouter,
1175
1231
  createRouterControls,
1232
+ createVirtualRoute,
1233
+ group,
1176
1234
  parameters
1177
1235
  };
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.0",
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": "7f8d946c9b6d11a4a828bdf2bafcf012970aa4d7"
58
58
  }