{"_id":"@cadilhac/vue3-router-ex","_rev":"16-f9c45d2e91ec3a742683d8c77244678d","name":"@cadilhac/vue3-router-ex","dist-tags":{"latest":"1.3.3"},"versions":{"1.0.0":{"name":"@cadilhac/vue3-router-ex","version":"1.0.0","keywords":["vue","vue3","router","route","vue-router","state-router","plugin","vue-plugin","guard","resolve"],"author":{"name":"Nicolas Cadilhac","email":"cadilhac@gmail.com"},"license":"MIT","_id":"@cadilhac/vue3-router-ex@1.0.0","maintainers":[{"name":"cadilhac","email":"cadilhac@gmail.com"}],"homepage":"https://github.com/cadilhac/vue3-router-ex#readme","bugs":{"url":"https://github.com/cadilhac/vue3-router-ex/issues"},"dist":{"shasum":"d66021e3799ac98404ee0b9b476b8a4d3f99fc99","tarball":"https://registry.npmjs.org/@cadilhac/vue3-router-ex/-/vue3-router-ex-1.0.0.tgz","fileCount":7,"integrity":"sha512-dOe8302X70I/Mi20ClkCm6zaPOt9MPDZcQusKAyp1bz5DsbZoTP3NQC21RRCasir3zvTQ1KS9UykHVOS3teg7g==","signatures":[{"sig":"MEUCIQDs9GRT73OPa4s+UFm/QDsf+OsGYeMm6OqowdMSO+xaBAIgEUNtqoX83GiPNKs4zlNbaBJ8YqOxHpibfCvr3Yqx+Z0=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":38054},"main":"./dist/vue3-router-ex.umd.cjs","type":"module","module":"./dist/vue3-router-ex.js","exports":{".":{"import":"./dist/vue3-router-ex.js","require":"./dist/vue3-router-ex.umd.cjs"},"./styles":"./dist/style.css"},"gitHead":"6b41a2d073b8ffe6910c4c7679a59cbba445bbef","private":false,"scripts":{"dev":"vite","build":"vite build","preview":"vite preview"},"_npmUser":{"name":"cadilhac","email":"cadilhac@gmail.com"},"repository":{"url":"git+https://github.com/cadilhac/vue3-router-ex.git","type":"git"},"_npmVersion":"9.8.1","description":"A plugin for Vue 3 that extends Vue Router with a dash of resolves, states and reachable named views.","directories":{},"_nodeVersion":"18.18.2","dependencies":{"vue":"^3.4.13"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.0.0","@vitejs/plugin-vue":"^5.0.3"},"_npmOperationalInternal":{"tmp":"tmp/vue3-router-ex_1.0.0_1705519799725_0.8154461830412689","host":"s3://npm-registry-packages"}},"1.1.2":{"name":"@cadilhac/vue3-router-ex","version":"1.1.2","keywords":["vue","vue3","router","route","vue-router","state-router","plugin","vue-plugin","guard","resolve"],"author":{"name":"Nicolas Cadilhac","email":"cadilhac@gmail.com"},"license":"MIT","_id":"@cadilhac/vue3-router-ex@1.1.2","maintainers":[{"name":"cadilhac","email":"cadilhac@gmail.com"}],"homepage":"https://github.com/cadilhac/vue3-router-ex#readme","bugs":{"url":"https://github.com/cadilhac/vue3-router-ex/issues"},"dist":{"shasum":"df205b2f8aed0c1b1c1075250a2b5ca7f8893382","tarball":"https://registry.npmjs.org/@cadilhac/vue3-router-ex/-/vue3-router-ex-1.1.2.tgz","fileCount":7,"integrity":"sha512-CtKUNVUWdL2bOIiLNvyzDkWOaflV4MTjrfHqPaqt/GC3JjtCsiNqhj1d7ddu/4kwrCjqrzCYoVPTdkXIjOiLIA==","signatures":[{"sig":"MEYCIQD4/AkkhD34coj1Xg0v4YVqvAxTyM8cpqqRv52Jr2hRhAIhAIwUiA4pAOg8xxywzqEnZkfoIoWLdVPXt5HWhzH/A9IF","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":39573},"main":"./dist/vue3-router-ex.umd.cjs","type":"module","module":"./dist/vue3-router-ex.js","exports":{".":{"import":"./dist/vue3-router-ex.js","require":"./dist/vue3-router-ex.umd.cjs"},"./styles":"./dist/style.css"},"gitHead":"5e6a0a8983d7fe08242a21ce247c81ebe019d619","private":false,"scripts":{"dev":"vite","build":"vite build","preview":"vite preview"},"_npmUser":{"name":"cadilhac","email":"cadilhac@gmail.com"},"repository":{"url":"git+https://github.com/cadilhac/vue3-router-ex.git","type":"git"},"_npmVersion":"11.6.0","description":"A plugin for Vue 3 that extends Vue Router with a dash of resolves, states and reachable named views.","directories":{},"_nodeVersion":"22.14.0","dependencies":{"vue":"^3.4.13"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.0.0","@vitejs/plugin-vue":"^5.0.3"},"_npmOperationalInternal":{"tmp":"tmp/vue3-router-ex_1.1.2_1758130568992_0.08783835435965948","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@cadilhac/vue3-router-ex","version":"1.2.0","keywords":["vue","vue3","router","route","vue-router","state-router","plugin","vue-plugin","guard","resolve"],"author":{"name":"Nicolas Cadilhac","email":"cadilhac@gmail.com"},"license":"MIT","_id":"@cadilhac/vue3-router-ex@1.2.0","maintainers":[{"name":"cadilhac","email":"cadilhac@gmail.com"}],"homepage":"https://github.com/cadilhac/vue3-router-ex#readme","bugs":{"url":"https://github.com/cadilhac/vue3-router-ex/issues"},"dist":{"shasum":"b62cc1f1cc22c5e84b24c3840c5e7eb7acd3a5db","tarball":"https://registry.npmjs.org/@cadilhac/vue3-router-ex/-/vue3-router-ex-1.2.0.tgz","fileCount":7,"integrity":"sha512-V9vugx57qZr4iLP5dvoo4NvuCj9TwbfXURvlDAxyvWI+C3YwHyxFdkHkxAOPbqnTnX0o/CEr080p4DgDuRlkzw==","signatures":[{"sig":"MEQCIG9gNtOhyATfzyI+HuAb3XesITXMY4WnYHjWtM/o+u+8AiBdbDMLz5wNj/GLUk20Ccb9U2qs/279+wnGDyzqVc0x1g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":44000},"main":"./dist/vue3-router-ex.umd.cjs","type":"module","module":"./dist/vue3-router-ex.js","exports":{".":{"import":"./dist/vue3-router-ex.js","require":"./dist/vue3-router-ex.umd.cjs"},"./styles":"./dist/style.css"},"gitHead":"5e6a0a8983d7fe08242a21ce247c81ebe019d619","private":false,"scripts":{"dev":"vite","build":"vite build","preview":"vite preview"},"_npmUser":{"name":"cadilhac","email":"cadilhac@gmail.com"},"repository":{"url":"git+https://github.com/cadilhac/vue3-router-ex.git","type":"git"},"_npmVersion":"11.6.0","description":"A plugin for Vue 3 that extends Vue Router with a dash of resolves, states and reachable named views.","directories":{},"_nodeVersion":"22.14.0","dependencies":{"vue":"^3.4.13"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.0.0","@vitejs/plugin-vue":"^5.0.3"},"_npmOperationalInternal":{"tmp":"tmp/vue3-router-ex_1.2.0_1758292831266_0.42531634090815906","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"@cadilhac/vue3-router-ex","version":"1.2.1","keywords":["vue","vue3","router","route","vue-router","state-router","plugin","vue-plugin","guard","resolve"],"author":{"name":"Nicolas Cadilhac","email":"cadilhac@gmail.com"},"license":"MIT","_id":"@cadilhac/vue3-router-ex@1.2.1","maintainers":[{"name":"cadilhac","email":"cadilhac@gmail.com"}],"homepage":"https://github.com/cadilhac/vue3-router-ex#readme","bugs":{"url":"https://github.com/cadilhac/vue3-router-ex/issues"},"dist":{"shasum":"dc7e4266937be4e32e9f689a49eff09feae78a72","tarball":"https://registry.npmjs.org/@cadilhac/vue3-router-ex/-/vue3-router-ex-1.2.1.tgz","fileCount":7,"integrity":"sha512-vTS0k1aLr8gWA/kgpXLXMHBRhzlgnYu83dhcWPgt7XFsS+WHpRy+Zvu+4X+OhjILhQGCgrUg7BDHmHMu/pFgPQ==","signatures":[{"sig":"MEQCIHg6seD77aSD0sBtvIuG2+g9HdKM9FZzLyi0zIIt+3GLAiANR/LxFw+r/jZMH4smDhH2Xah9ntPouKbpeiqTgiP2Ew==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":44212},"main":"./dist/vue3-router-ex.umd.cjs","type":"module","module":"./dist/vue3-router-ex.js","exports":{".":{"import":"./dist/vue3-router-ex.js","require":"./dist/vue3-router-ex.umd.cjs"},"./styles":"./dist/style.css"},"gitHead":"48302ee557a66fb59e8a2e3031f47df2694d1cdd","private":false,"scripts":{"dev":"vite","build":"vite build","preview":"vite preview"},"_npmUser":{"name":"cadilhac","email":"cadilhac@gmail.com"},"repository":{"url":"git+https://github.com/cadilhac/vue3-router-ex.git","type":"git"},"_npmVersion":"11.6.0","description":"A plugin for Vue 3 that extends Vue Router with a dash of resolves, states and reachable named views.","directories":{},"_nodeVersion":"22.14.0","dependencies":{"vue":"^3.4.13"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.0.0","@vitejs/plugin-vue":"^5.0.3"},"_npmOperationalInternal":{"tmp":"tmp/vue3-router-ex_1.2.1_1759840305906_0.4524400480976676","host":"s3://npm-registry-packages-npm-production"}},"1.2.3":{"name":"@cadilhac/vue3-router-ex","version":"1.2.3","keywords":["vue","vue3","router","route","vue-router","state-router","plugin","vue-plugin","guard","resolve"],"author":{"name":"Nicolas Cadilhac","email":"cadilhac@gmail.com"},"license":"MIT","_id":"@cadilhac/vue3-router-ex@1.2.3","maintainers":[{"name":"cadilhac","email":"cadilhac@gmail.com"}],"homepage":"https://github.com/cadilhac/vue3-router-ex#readme","bugs":{"url":"https://github.com/cadilhac/vue3-router-ex/issues"},"dist":{"shasum":"1294a8f5063695d8ce77ac1552e5592aba689750","tarball":"https://registry.npmjs.org/@cadilhac/vue3-router-ex/-/vue3-router-ex-1.2.3.tgz","fileCount":7,"integrity":"sha512-a230BSV5CJCU/YV5Dcrhx5lgd794dBRNsgBg6WfF0kSywWxKgm4hjV51KDzl+leZXzW0mKAJ0MNTAxAlwrerTg==","signatures":[{"sig":"MEUCIQDY4okY7zU4ha4kp9tL9o6FBW9Irp/OfxQE2TmUircDUQIgejIwEkegHq+PN5f1rzSxViHHk+yc7yiQpDX/RUqJkmY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":44657},"main":"./dist/vue3-router-ex.umd.cjs","type":"module","module":"./dist/vue3-router-ex.js","exports":{".":{"import":"./dist/vue3-router-ex.js","require":"./dist/vue3-router-ex.umd.cjs"},"./styles":"./dist/style.css"},"gitHead":"ac1d30ff59714a9435e550db9a9436159704a68d","private":false,"scripts":{"dev":"vite","build":"vite build","preview":"vite preview"},"_npmUser":{"name":"cadilhac","email":"cadilhac@gmail.com"},"repository":{"url":"git+https://github.com/cadilhac/vue3-router-ex.git","type":"git"},"_npmVersion":"11.6.2","description":"A plugin for Vue 3 that extends Vue Router with a dash of resolves, states and reachable named views.","directories":{},"_nodeVersion":"22.14.0","dependencies":{"vue":"^3.4.13"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.0.0","@vitejs/plugin-vue":"^5.0.3"},"_npmOperationalInternal":{"tmp":"tmp/vue3-router-ex_1.2.3_1762289671914_0.9830456429128811","host":"s3://npm-registry-packages-npm-production"}},"1.2.4":{"name":"@cadilhac/vue3-router-ex","version":"1.2.4","keywords":["vue","vue3","router","route","vue-router","state-router","plugin","vue-plugin","guard","resolve"],"author":{"name":"Nicolas Cadilhac","email":"cadilhac@gmail.com"},"license":"MIT","_id":"@cadilhac/vue3-router-ex@1.2.4","maintainers":[{"name":"cadilhac","email":"cadilhac@gmail.com"}],"homepage":"https://github.com/cadilhac/vue3-router-ex#readme","bugs":{"url":"https://github.com/cadilhac/vue3-router-ex/issues"},"dist":{"shasum":"100494408a11799249263c64712c1bb5c0b17888","tarball":"https://registry.npmjs.org/@cadilhac/vue3-router-ex/-/vue3-router-ex-1.2.4.tgz","fileCount":7,"integrity":"sha512-qcgmsiytGu3cPi0blrnsjB19KrQSi72pSNHdrPL85xNbil2gHnOYEa/4v76Q1oRU7WpExJSDqhJDQ8AZGDBZhw==","signatures":[{"sig":"MEYCIQCNmOaEe2E2uLy/k6f8QP72nncivMjbvo42uOavNXR6TwIhAOxSu3BBkmvLjzP1jUsSk2KQVTgRGZfpjMtQy/iRGTpJ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":44701},"main":"./dist/vue3-router-ex.umd.cjs","type":"module","module":"./dist/vue3-router-ex.js","exports":{".":{"import":"./dist/vue3-router-ex.js","require":"./dist/vue3-router-ex.umd.cjs"},"./styles":"./dist/style.css"},"gitHead":"1b33c1f7621ea82c22f0b47ab2c6dd3344e490bb","private":false,"scripts":{"dev":"vite","build":"vite build","preview":"vite preview"},"_npmUser":{"name":"cadilhac","email":"cadilhac@gmail.com"},"repository":{"url":"git+https://github.com/cadilhac/vue3-router-ex.git","type":"git"},"_npmVersion":"11.6.2","description":"A plugin for Vue 3 that extends Vue Router with a dash of resolves, states and reachable named views.","directories":{},"_nodeVersion":"22.14.0","dependencies":{"vue":"^3.4.13"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.0.0","@vitejs/plugin-vue":"^5.0.3"},"_npmOperationalInternal":{"tmp":"tmp/vue3-router-ex_1.2.4_1762379978221_0.03070695026337189","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@cadilhac/vue3-router-ex","version":"1.3.0","keywords":["vue","vue3","router","route","vue-router","state-router","plugin","vue-plugin","guard","resolve"],"author":{"name":"Nicolas Cadilhac","email":"cadilhac@gmail.com"},"license":"MIT","_id":"@cadilhac/vue3-router-ex@1.3.0","maintainers":[{"name":"cadilhac","email":"cadilhac@gmail.com"}],"homepage":"https://github.com/cadilhac/vue3-router-ex#readme","bugs":{"url":"https://github.com/cadilhac/vue3-router-ex/issues"},"dist":{"shasum":"ee261bd8977cebb4fe315e91102cab4607375431","tarball":"https://registry.npmjs.org/@cadilhac/vue3-router-ex/-/vue3-router-ex-1.3.0.tgz","fileCount":7,"integrity":"sha512-BWIkFZsAI/c3s4zKMcJf/RisqcTMjFJdQqwOpa7zFghVXSyDYFNxzpqllDBeQjoJtCGl6k42g8JDI62wLDS/cg==","signatures":[{"sig":"MEQCICeRLZ+1aF+N9mUKnjYYKaIPrhqjDtqpL8kUPJB2E3ObAiBUaj1bxPwZtm578aXD+IDrRd755j/Qkli3rJboVwdkFA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":45046},"main":"./dist/vue3-router-ex.umd.cjs","type":"module","module":"./dist/vue3-router-ex.js","exports":{".":{"import":"./dist/vue3-router-ex.js","require":"./dist/vue3-router-ex.umd.cjs"},"./styles":"./dist/style.css"},"gitHead":"8e893310cfbffeb53aaa9092d9c3077d090ca8a5","private":false,"scripts":{"dev":"vite","build":"vite build","preview":"vite preview"},"_npmUser":{"name":"cadilhac","email":"cadilhac@gmail.com"},"repository":{"url":"git+https://github.com/cadilhac/vue3-router-ex.git","type":"git"},"_npmVersion":"11.9.0","description":"A plugin for Vue 3 that extends Vue Router with a dash of resolves, states and reachable named views.","directories":{},"_nodeVersion":"25.6.1","dependencies":{"vue":"^3.4.13"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.0.0","@vitejs/plugin-vue":"^5.0.3"},"_npmOperationalInternal":{"tmp":"tmp/vue3-router-ex_1.3.0_1776816943616_0.7816244385753428","host":"s3://npm-registry-packages-npm-production"}},"1.3.1":{"name":"@cadilhac/vue3-router-ex","version":"1.3.1","keywords":["vue","vue3","router","route","vue-router","state-router","plugin","vue-plugin","guard","resolve"],"author":{"name":"Nicolas Cadilhac","email":"cadilhac@gmail.com"},"license":"MIT","_id":"@cadilhac/vue3-router-ex@1.3.1","maintainers":[{"name":"cadilhac","email":"cadilhac@gmail.com"}],"homepage":"https://github.com/cadilhac/vue3-router-ex#readme","bugs":{"url":"https://github.com/cadilhac/vue3-router-ex/issues"},"dist":{"shasum":"9f095a41d600cb51baca48a09c80c3a9b0fd249c","tarball":"https://registry.npmjs.org/@cadilhac/vue3-router-ex/-/vue3-router-ex-1.3.1.tgz","fileCount":7,"integrity":"sha512-GwicDrK9rEHFYNNqAUB1LrsjV9dSawN33jaGoxOySlXwDrnIjf974sHlkWTZEbrF3ZMcCEpDOXbd6RWO0AVhvA==","signatures":[{"sig":"MEUCIE2sLNz4J2OekWEra7b0h9Ce2VIRUwTmlSiD8r3rPPDJAiEAiS1k+ht3eNlSCeyudKgnbpeSVOYvZPsinCZFBvVRkAA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":45743},"main":"./dist/vue3-router-ex.umd.cjs","type":"module","module":"./dist/vue3-router-ex.js","exports":{".":{"import":"./dist/vue3-router-ex.js","require":"./dist/vue3-router-ex.umd.cjs"},"./styles":"./dist/style.css"},"gitHead":"da37c3fb2c23e651e1c420a0a8dbae91e784991f","private":false,"scripts":{"dev":"vite","build":"vite build","preview":"vite preview"},"_npmUser":{"name":"cadilhac","email":"cadilhac@gmail.com"},"repository":{"url":"git+https://github.com/cadilhac/vue3-router-ex.git","type":"git"},"_npmVersion":"11.9.0","description":"A plugin for Vue 3 that extends Vue Router with a dash of resolves, states and reachable named views.","directories":{},"_nodeVersion":"25.6.1","dependencies":{"vue":"^3.4.13"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.0.0","@vitejs/plugin-vue":"^5.0.3"},"_npmOperationalInternal":{"tmp":"tmp/vue3-router-ex_1.3.1_1777417838161_0.31371401915481645","host":"s3://npm-registry-packages-npm-production"}},"1.3.2":{"name":"@cadilhac/vue3-router-ex","version":"1.3.2","keywords":["vue","vue3","router","route","vue-router","state-router","plugin","vue-plugin","guard","resolve"],"author":{"name":"Nicolas Cadilhac","email":"cadilhac@gmail.com"},"license":"MIT","_id":"@cadilhac/vue3-router-ex@1.3.2","maintainers":[{"name":"cadilhac","email":"cadilhac@gmail.com"}],"homepage":"https://github.com/cadilhac/vue3-router-ex#readme","bugs":{"url":"https://github.com/cadilhac/vue3-router-ex/issues"},"dist":{"shasum":"d9e6ab429c4bd95b29934374b72bf6d895b6a615","tarball":"https://registry.npmjs.org/@cadilhac/vue3-router-ex/-/vue3-router-ex-1.3.2.tgz","fileCount":7,"integrity":"sha512-eXvmexm7MxGpkQpnHqFF0EoK6WRl74Lx+788I5K4+utRliyGFrX5YLPMhfpawcxnYsusvSokpdmdf7SLc4ZfSA==","signatures":[{"sig":"MEUCIQDNZeymkJlrax7KAL85pMw+dRRvTBe7J8T9yfdoT+WtrQIgJhQMo9pxrO24T48K4QjEqoXvtPz0AEfG7s1gznolpXU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":45336},"main":"./dist/vue3-router-ex.umd.cjs","type":"module","module":"./dist/vue3-router-ex.js","exports":{".":{"import":"./dist/vue3-router-ex.js","require":"./dist/vue3-router-ex.umd.cjs"},"./styles":"./dist/style.css"},"gitHead":"5790c392bb1205f701d897e3cf7e0a829fa6c267","private":false,"scripts":{"dev":"vite","build":"vite build","preview":"vite preview"},"_npmUser":{"name":"cadilhac","email":"cadilhac@gmail.com"},"repository":{"url":"git+https://github.com/cadilhac/vue3-router-ex.git","type":"git"},"_npmVersion":"11.9.0","description":"A plugin for Vue 3 that extends Vue Router with a dash of resolves, states and reachable named views.","directories":{},"_nodeVersion":"25.6.1","dependencies":{"vue":"^3.4.13"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.0.0","@vitejs/plugin-vue":"^5.0.3"},"_npmOperationalInternal":{"tmp":"tmp/vue3-router-ex_1.3.2_1779570549369_0.45374501105584675","host":"s3://npm-registry-packages-npm-production"}},"1.3.3":{"author":{"name":"Nicolas Cadilhac","email":"cadilhac@gmail.com"},"repository":{"type":"git","url":"git+https://github.com/cadilhac/vue3-router-ex.git"},"private":false,"name":"@cadilhac/vue3-router-ex","version":"1.3.3","description":"A plugin for Vue 3 that extends Vue Router with a dash of resolves, states and reachable named views.","license":"MIT","keywords":["vue","vue3","router","route","vue-router","state-router","plugin","vue-plugin","guard","resolve"],"type":"module","main":"./dist/vue3-router-ex.umd.cjs","module":"./dist/vue3-router-ex.js","exports":{".":{"import":"./dist/vue3-router-ex.js","require":"./dist/vue3-router-ex.umd.cjs"},"./styles":"./dist/style.css"},"scripts":{"dev":"vite","build":"vite build","preview":"vite preview"},"dependencies":{"vue":"^3.4.13"},"devDependencies":{"@vitejs/plugin-vue":"^5.0.3","vite":"^5.0.0"},"gitHead":"ab436f42ebfd00b281acd523f021d9994401a949","_id":"@cadilhac/vue3-router-ex@1.3.3","bugs":{"url":"https://github.com/cadilhac/vue3-router-ex/issues"},"homepage":"https://github.com/cadilhac/vue3-router-ex#readme","_nodeVersion":"25.6.1","_npmVersion":"11.9.0","dist":{"integrity":"sha512-Bq5lmPOb6WoGiz/rdxn95qaxeOhHMHJXvSUBwNYwL/lEesJVi/DM5kvC8UYWVKmsN8WMPK3oB0ZiiddcOL2F4g==","shasum":"3221a43fc6fee71704b44d5b8b487450ec738114","tarball":"https://registry.npmjs.org/@cadilhac/vue3-router-ex/-/vue3-router-ex-1.3.3.tgz","fileCount":7,"unpackedSize":45548,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCrjphiyTQrgfhNoaLzS0AZFgxQfhdIrBS6b4MHQMxlVAIhAKg//XRqCYEBUo8mGooSA//GZAVKPaT/zFnBAxnCo2fH"}]},"_npmUser":{"name":"cadilhac","email":"cadilhac@gmail.com"},"directories":{},"maintainers":[{"name":"cadilhac","email":"cadilhac@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/vue3-router-ex_1.3.3_1788805722231_0.5758148614102432"},"_hasShrinkwrap":false}},"time":{"created":"2024-01-17T19:29:59.614Z","modified":"2026-09-07T18:28:42.534Z","1.0.0":"2024-01-17T19:29:59.928Z","1.1.0":"2025-09-16T17:46:51.116Z","1.1.1":"2025-09-16T17:53:18.157Z","1.1.2":"2025-09-17T17:36:09.169Z","1.2.0":"2025-09-19T14:40:31.441Z","1.2.1":"2025-10-07T12:31:46.151Z","1.2.2":"2025-11-04T20:40:02.689Z","1.2.3":"2025-11-04T20:54:32.086Z","1.2.4":"2025-11-05T21:59:38.412Z","1.3.0":"2026-04-22T00:15:43.751Z","1.3.1":"2026-04-28T23:10:38.282Z","1.3.2":"2026-05-23T21:09:09.498Z","1.3.3":"2026-09-07T18:28:42.372Z"},"bugs":{"url":"https://github.com/cadilhac/vue3-router-ex/issues"},"author":{"name":"Nicolas Cadilhac","email":"cadilhac@gmail.com"},"license":"MIT","homepage":"https://github.com/cadilhac/vue3-router-ex#readme","keywords":["vue","vue3","router","route","vue-router","state-router","plugin","vue-plugin","guard","resolve"],"repository":{"type":"git","url":"git+https://github.com/cadilhac/vue3-router-ex.git"},"description":"A plugin for Vue 3 that extends Vue Router with a dash of resolves, states and reachable named views.","maintainers":[{"name":"cadilhac","email":"cadilhac@gmail.com"}],"readme":"# Introduction\r\n\r\nI created this library while learning Vue in the process of porting an existing web app ([Coludik](https://coludik.com) which allows board game players to share their own games and borrow those of others) from AngularJS to Vue 3. I was making extensive use of the power of [ui-router](https://github.com/angular-ui/ui-router), a state-based router that defines itself like so:\r\n\r\n> UI-Router applications are modeled as a hierarchical tree of states. UI-Router provides a state machine to manage the transitions between those application states in a transaction-like manner.\r\n\r\nUsed to using this specificity of ui-router, I very quickly came across some Vue Router's limitations: it's impossible to define pathless routes that represent different possible states for the same path; out of the box, it's impossible for a deep route to fill a named view that's higher in the tree than its parent; nor is there a well-defined way of declaring the set of data you need to load for a route; and finally, it's also not easy to lazy load different templates targeting different named views depending on a criterion (such as being on a mobile or a computer).\r\n\r\n# Features\r\n\r\nWith vue3-router-ex, you can enhance a route definition to:\r\n\r\n1. Indicate which data you require. To validate a route, all data must first be loaded (usually asynchronously) and it can be done hierarchically (i.e. some data can depend on others, coming from the current or an ancestor route).\r\n2. Redirect to another route if needed. You don't need to load all the data first, just the one you need to choose to redirect or not.\r\n3. Implicitly define states by choosing which data subset to load according to a criterion (usually a first discriminating data) and which components to assign to named views (based on the data or another criterion like being on a mobile or not). These components can be placed anywhere higher in the hierarchy of routed components by using a custom `router-view-ex` directive which seamlessly replaces `router-view`.\r\n4. Hook into the Vue Router guards.\r\n\r\nvue3-router-ex also ensures that component props (the ones you get with `defineProps`) include:\r\n\r\n1. The route parameters.\r\n2. The query string parameters.\r\n3. Some variables that are not part of the route url (i.e. not in params or query). It uses windows.history.state to pass these variables.\r\n\r\nA navigation directive (`v-route-to`) is also provided so that a click to any target element can trigger a route change.\r\n\r\nAt last, alongside `defineProps`, it allows to get all the (often fetched) data (see [resolves](#resolves)) set in the route definition, thanks to a new defineResolves function.\r\n\r\n# Installation and general setup\r\n\r\nAdd this library to your existing Vue 3 project:\r\n\r\n```\r\nnpm install @cadilhac/vue3-router-ex\r\n```\r\n\r\nIn your main javascript file:\r\n\r\n```javascript\r\nimport { plugin as vueRouterEx } from '@cadilhac/vue3-router-ex'\r\nimport '@cadilhac/vue3-router-ex/styles'    // Only if you use the optional fade transition\r\n\r\n// [...]\r\n\r\napp.use(router)\r\napp.use(vueRouterEx, {\r\n    router,\r\n    globalerrorHandler: () => {\r\n        // An example of what to do with an exception coming from the plugin itself:\r\n\r\n        // Show an error message\r\n        toast.error('An unknown error has occured. Please, contact the administrator for support.')\r\n\r\n        // Redirect to your main route\r\n        return { name: 'home' }\r\n    }\r\n})\r\n\r\n// [...]\r\n```\r\n\r\nNote that you only need to import the styles if you use the [optional fade transition](#transition) supplied with the plugin.\r\n\r\n# Route definitions\r\n\r\nWhen dealing with route definitions, everything lies in [the power of the meta](https://router.vuejs.org/guide/advanced/meta.html). Here is the skeleton of a route definition embracing all vue3-router-ex benefits:\r\n\r\n```javascript\r\nconst routes = [{\r\n    // Avoid adding a 'children' property in your routes. Instead use a 'parent' property (vue3-router-ex specific feature).\r\n    // It's a lot clearer and allows splitting routes, each one (or related ones) in its own file.\r\n    parent: 'someParent',\r\n    name: 'someName',\r\n    path: 'somePath',\r\n    component: {},  // An empty component property to avoid a Vue Router warning.\r\n    meta: {\r\n        resolve: {\r\n        },\r\n        resolveFilter: async function (resolver, transition) {\r\n        },\r\n        components: (viewName, route) => {\r\n        },\r\n        redirectTo: async function (resolver, transition) {\r\n        },\r\n        beforeEnterBegin: async function (to, from) {\r\n        },\r\n        beforeEnterEnd: async function (to, from, failure) {\r\n        },\r\n        afterEnter: async function (to, from, failure) {\r\n        },\r\n        // All othe meta fields you need, for instance:\r\n        // requiresAuth: true\r\n    }\r\n    // Don't add a props property. The plugin will take care of adding a custom one.\r\n},\r\n{\r\n    // Another route\r\n}]\r\n```\r\n\r\nBefore going into the meat of this, the route definitions must pass through the plugin and it will take care of actually adding them to the router (in the correct order to respect parent/child relationships). This is done with the `useRoutesLoader` function. Here is an example of the file where the router is created:\r\n\r\n```javascript\r\nimport { createRouter, createWebHistory } from 'vue-router'\r\nimport { useRoutesLoader } from '@cadilhac/vue3-router-ex'\r\n\r\n// Route definitions are written in separate files\r\nimport routeDefinitions from './routedefinitions'\r\n\r\nconst router = createRouter({\r\n  history: createWebHistory(),\r\n  routes: []\r\n})\r\n\r\n// routeDefinitions can be an array of routes or an array of arrays of routes\r\nconst routesBuilder = useRoutesLoader(router, routeDefinitions)\r\n\r\nexport default router\r\n```\r\n\r\nIn case you are wondering, the routedefinitions folder in the example has an index.js file that collects all files that define routes:\r\n\r\n```javascript\r\nimport user from './user.js'\r\nimport dashboard from './dashboard.js'\r\nimport settings from './settings.js'\r\n\r\nexport default [\r\n    user,\r\n    dashboard,\r\n    settings\r\n]\r\n```\r\n\r\n# Resolves\r\n\r\nIf you come, like me, from the AngularJS/ui-router world, then you know what resolves are. The author defines this as:\r\n\r\n> The resolve subsystem is an asynchronous, hierarchical Dependency Injection system.\r\n\r\nSaid otherwise, resolves are data you want to load and that are a prerequisite to the route being targeted. If you want to load a user profile object from the server and the user does not exist in the database, then you can't go to the profile route. Instead, typically, you will be redirected to another route and an error message will be displayed.\r\n\r\n## Resolve definitions\r\n\r\nHere is a resolve example:\r\n\r\n```javascript\r\nmeta: {\r\n    resolve: {\r\n        game: ['$transition$', function ($transition$) {\r\n            const personalGameService = usePersonalGameService()\r\n            return personalGameService.getGame($transition$.to.params.id).then(\r\n                function (game) {\r\n                    return game;\r\n                });\r\n        }],\r\n        pageTitle: ['game', function (game) {\r\n            return {\r\n                'fr': 'Prêt de ' + game.name,\r\n                'en': 'Sharing ' + game.name\r\n            }\r\n        }]\r\n    }\r\n}\r\n```\r\n\r\n`resolve` is an object whose key/value pairs each correspond to the name of a data and a function (or an array whose last item is a function) that returns either its value or a Promise. In both cases, it can have a list of arguments which are considered dependencies, each dependency being another value or promise, either defined in the current route or in a parent route.  \r\nAs you can see, there are two resolves here: `game` and `pageTitle`. In the case of `game`, the `$transition$` dependency is a special one. It is handled by the plugin and is simply an object containing the 'from' and 'to' routes as well as the history state if any (passed to router.push), i.e. `{ to, from, historyState }`. You don't need to define this resolve. It will always be here for you. The body of the `game` function is a classic async call to the server. In the case of `pageTitle`, the argument is `game` and it returns a localized string containing the game name (better to use i18n here).\r\n\r\nYour resolves can be defined in any order. The plugin takes care of handling them in the correct order.\r\n\r\nNote that both resolves are not just a function, like:\r\n\r\n```javascript\r\npageTitle: function (game) {\r\n    return {\r\n        'fr': 'Prêt de ' + game.name,\r\n        'en': 'Sharing ' + game.name\r\n    }\r\n}\r\n```\r\n\r\nInstead, we have to use a trick (an array of the argument names and the function itself as the last argument) that will make this injection mechanism survive the minification step when we build for production. Without it, the argument names would be changed and the injection mechanism would not know what they mean. This trick is taken from the AngularJS code itself. If there are no dependencies, you can use a simple function instead of an array.\r\n\r\n## Resolve access\r\n\r\nIn your component, you can easily access your resolves with the defineResolves function (this is not a macro like defineProps):\r\n\r\n```javascript\r\n    const { game, pageTitle } = defineResolves(['game', 'pageTitle'])\r\n```\r\n\r\nDestructuration is mandatory if you want to use the resolves in your template, as each resolve is reactive. And since they are reactive, you can [watch](https://vuejs.org/guide/essentials/watchers) them, which is very useful when transitioning from a route to the same route that has different parameter values.\r\n\r\nIf the resolve name does not correspond to an actual resolve defined in your route, then a ref(undefined) is returned.\r\n\r\n# Component props\r\n\r\n1. Route parameters: when a component is loaded for an activated route, you can normally use `defineProps` to get the parameters that are defined on the route. This is what Vue Router already offers.\r\n\r\n\t```javascript\r\n\t// With this route definition:\r\n\tconst routes = [{\r\n\tname: 'user',\r\n\tpath: 'user/:id',\r\n\t// [...]\r\n\t}]\r\n\r\n\t// You can write in your component:\r\n\tconst props = defineProps(['id'])\r\n\t```\r\n\r\n2. Custom parameters: with Vue Router, you can pass some values that are not part of a route url by adding a `state` property to your `push` call argument. If you need them to be part of component props, use a `props` property inside this `state` property:\r\n\r\n    ```javascript\r\n    router.push({\r\n        name: 'registerStep2',\r\n        state: {\r\n            props: {\r\n                location\r\n            }\r\n        }\r\n    })\r\n\r\n    // You can then use in your component:\r\n    const props = defineProps(['location'])\r\n    ```\r\n    \r\n    Note: this implies that route parameters and custom `state` parameters must have distinct names.\r\n\r\n\tThis works well when you're navigating to a new route. Unfortunately, this won't be the case if you try to navigate to the current route with only a change in `state`. In this case, the good old Vue-Router generates a 'duplicated route' error and it's impossible for the components of your route to be notified of the new state. This plugin provides the solution.\r\n\r\n\tIn your component:\r\n\r\n\t```javascript\r\n\tconst routeState = defineModel('routeState', { required: false, type: Object })\r\n\r\n\tonUpdated(() => {\r\n\t\t// New state in routeState.value.myCustomState\r\n\t})\r\n\r\n\t// Or if you prefer to watch it:\r\n\twatch(routeState, (state) => {\r\n\t\t// New state in state.myCustomState\r\n\t})\r\n    ```\r\n\r\n# Route states\r\n\r\nContrarily to ui-router for AngularJs, Vue Router is not a [state router](https://ui-router.github.io/guide/states), which means you can't have several route definitions that have the same path (either siblings or parent/child). The goal here is to simulate these states by letting the route definition specify a set of resolves and a set of components to use depending on some custom criteria. In Coludik, the game you load for a specific url may be a game you share or a game you have borrowed. These are 2 different states that demand different resolves and display different components (UI, i.e. templates, and code) in the named views.\r\n\r\n## Filtering resolves\r\n\r\nThe magic of the resolves is that they are not eagerly loaded up front. A data structure is prepared so that the plugin knows how to load them and in which order but it differs the actual loading until you actually need it.\r\n\r\nOnce this data structure has been built, and after you had a chance to redirect to another route (see later), the plugin gives you the possibility to say that you are in a certain state and that you need a subset only of the declared resolves. It's like going to another route that declares only this subset while keeping the same path. You do that with the `meta.resolveFilter` property.\r\n\r\nHere is an example:\r\n\r\n```javascript\r\nmeta: {\r\n    resolveFilter: async function (resolver, transition) {\r\n        const game = await resolver.game\r\n\r\n        if (game.isMine)\r\n            return ['game', 'pageTitle', 'borrower']\r\n        else if (game.isBorrowed)\r\n            return ['game', 'pageTitle', 'ownerUser', 'personalGamesPrefs', 'discussion']\r\n    }\r\n}\r\n```\r\n\r\n`resolveFilter` is a function that returns an array of the subset of resolves you need after you establish that your app is in a certain state. At this stage, instead of giving to you all the resolved data, it only gives you an object (`resolver`) that knows how to load the needed data. In the example, I needed only the game to know if it is my game that is in an available state or if this is one that I borrowed from someone else. The resolver is a kind of proxy so you just append the data you need to it and place an await in front and you will get your data. A transition `{to, from}` is also passed to the function in case you need it as well.\r\n\r\n## Components\r\n\r\nOnce you know your state, or if you simply have no specific states at all, you are given a way to assign some components anywhere inside named views of the ancestor component templates. This has two aspects: a new directive for views and component definitions in the route definition.\r\n\r\nIn order to place your components in named views, you have to use a new directive called `router-view-ex`, like so:\r\n\r\n```html\r\n<router-view-ex name=\"MainContent\"></router-view-ex>\r\n```\r\n\r\nPretty straightforward. This custom `router-view` knows how to search for the components you define in the meta of your route definitions with the `components` property. `components` can be an object or a function. In the first case, the keys of the object are view names and the values are either a function taking the current route as the single argument or a component (which is the same as using the core `components` property in a route definition):\r\n\r\n```javascript\r\nmeta: {\r\n    components: {\r\n        'app': (route) => {\r\n            const responsiveHelper = useResponsiveHelperStore()\r\n            return responsiveHelper.isPhone ?\r\n                import('../views/Platform.phone.vue') :\r\n                import('../views/Platform.vue')\r\n        }\r\n    }\r\n}\r\n```\r\n\r\nIn the second case, the function receives the view name and the route (for access to your route data for instance) in arguments:\r\n\r\n```javascript\r\nmeta: {\r\n    components: (viewName, route) => {\r\n        const game = route.meta.resolves.game\r\n\r\n        if (game.isMine) {\r\n            if (viewName === 'MainContent')\r\n                return () => import('../views/MyPersonalGame.vue')\r\n        }\r\n        else if (game.isBorrowed) {\r\n            if (viewName === 'MainContent')\r\n                return () => import('../views/BorrowedGame.vue')\r\n        }\r\n    }\r\n}\r\n```\r\n\r\nThere is no resolver this time because, at this stage, all your filtered resolves have been loaded and they are available in `route.meta.resolves`. You just need a view name to know what component to place in there.\r\n\r\nIn both examples, the component is lazy loaded (this is not an obligation as you could just write `return MyPersonalGame`). This is a perfect way to load only what you need and the perfect use case for me is discriminating between templates used on desktops and templates used on mobiles (and if you do it well, there is no need to duplicate the code in your MypersonalGame.vue and MyPersonalGame.phone.vue files).\r\n\r\nNote that the `components` property in `meta` overrides the one at the root of the route definition. This means that you can still have both (a default view could still be placed in the second one for instance).\r\n\r\n### Transition\r\n\r\nThe `router-view-ex` takes an optional transition attribute in case you want to animate components switching into your named view. The plugin is supplied with a default fade transition that you can activate with (the 'vre' prefix stands for vue3-router-ex):\r\n\r\n```html\r\n<router-view-ex name=\"MainContent\" transition=\"vre-fade\"></router-view-ex>\r\n```\r\n\r\nThis transition is defined like this and is mainly here to show you the concept (although you can use it):\r\n\r\n```css\r\ntransition: opacity 0.1s ease;\r\n```\r\n\r\nIf you want to use your own transition, just name it the way you want and [define your proper styles](https://vuejs.org/guide/built-ins/transition#css-based-transitions) as you normally do for Vue 3 transitions.\r\n\r\n# Redirection\r\n\r\nWhen the resolver that we have seen before is ready, the plugin gives you the opportunity to determine if you want to redirect to another route. This is done by adding a `meta.redirectTo` to your route definition that is a function returning a new route object.\r\n\r\n```javascript\r\nmeta: {\r\n    redirectTo: async function (resolver, transition) {\r\n        const game = await resolver.game\r\n\r\n        if (!game.isMine && !game.isBorrowed) {\r\n            return { name: 'publicPersonalGame', params: { id: game.id, name: dashify(game.name) } };\r\n        }\r\n    }\r\n}\r\n```\r\n\r\nIn this example, if the browser targets a game that is not mine or that I don't borrow, then it will redirect to the public page of the corresponding game listing.\r\n\r\nYou can also redirect to another route at some other stages, thanks to hook.\r\n\r\n# Hooks\r\n\r\n## beforeEnterBegin\r\n\r\nAs you probably know, when you use the composition API, there is no way to hook into routing inside your components. Only `onBeforeRouteUpdate` and `onBeforeRouteLeave` can be defined there. This plugin does not solve this exactly but it gives you the possibility to know when the route is being entered inside your route definition.\r\n\r\nThe plugin uses the `beforeEach` method of the router and calls your `meta.beforeEnterBegin` right away. At this stage, your resolves are not known yet, but this is a perfect place to redirect for other reasons than a resolve that would dictate so (where `meta.redirectTo` is better suited).\r\n\r\nFor instance, you can protect some pages against non logged in users or avoid pages that don't make sense for a logged in user, and redirect by returning a target:\r\n\r\n```javascript\r\nmeta: {\r\n    beforeEnterBegin: (to, from) => {\r\n        if (to.meta.requiresAuth) {\r\n            const { authUser } = useAuthUserStore()\r\n            const { appSettings } = useAppSettings()\r\n\r\n            if (!authUser.isLoggedIn) {\r\n                toast.error(appSettings.localized.needAccount)\r\n                return { name: 'signin', query: { returnUrl: to.path } }\r\n            }\r\n        }\r\n\r\n        if (to.meta.requiresAnon) {\r\n            const { authUser } = useAuthUserStore()\r\n            if (authUser.isLoggedIn) {\r\n                return { name: 'explore' }\r\n            }\r\n        }\r\n    }\r\n}\r\n```\r\n\r\nNote that the `mea.beforeEnterBegin` function is called in each matched route, from ancestors to children. This example lies in the top route, since it is general. If it redirects, child `meta.beforeEnterBegin` are not called.\r\n\r\n## beforeEnterEnd\r\n\r\nAfter your `meta.redirectTo` has been called and after your resolves have been loaded, `meta.beforeEnterEnd` is called, this time in reverse order, from child to ancestors. It's also called when an exception occurs in your code (in one of your resolve function for instance), in which case the failure argument equals `{ context: 'resolve', error: ... }`. In this example, your code redirects to a signin page when your server returns Unauthorized while one of your resolves was fetched (resulting in an axios rejection):\r\n\r\n```javascript\r\nmeta: {\r\n    beforeEnterEnd: (to, from, failure) => {\r\n        if (failure && failure.context === 'resolve' && failure.error?.status === 401) {\r\n            return { name: 'signin' }\r\n        }\r\n    }\r\n}\r\n```\r\n\r\n## afterEnter\r\n\r\nWhen a route is accepted or has a failure, the `router.afterEach` handler is still called to let you know. In that case, your `meta.afterEnter` functions in all matched routes will be called, from child to ancestors.\r\n\r\nHere is an example where I handle the page title and some potential error. It could also deal with analytics.\r\n\r\n```javascript\r\nmeta: {\r\n    afterEnter: async (to, from, failure) => {\r\n        if (failure && !isNavigationFailure(failure, NavigationFailureType.duplicated)) {\r\n            // Something bad happened in Vue Router\r\n            toast.error(i18n.global.t('global.routeUnreachable'))\r\n            return\r\n        }\r\n\r\n        // Handle page title that can be set statically (in meta) or dynamically in resolves (put in meta.resolves from resolves)\r\n        const pageTitle = to.meta.pageTitle ?? to.meta?.resolves?.pageTitle\r\n        if (pageTitle) {\r\n            const { appSettings } = useAppSettings()\r\n            document.title = pageTitle[appSettings.lang] || pageTitle\r\n        }\r\n        else {\r\n            document.title = 'Generic title'\r\n        }\r\n    }\r\n}\r\n```\r\n\r\n# Directive\r\n\r\nAny element can trigger a route change thanks to the `v-route-to` directive.\r\n\r\n```javascript\r\n<Button label=\"Forgot password\"\tv-route-to=\"{ name: 'signin', state: { props: { forgotPwd: true }} }\">\r\n</Button>\r\n```\r\n","readmeFilename":"README.md"}