Skip to content

Commit 3eb9cb4

Browse files
author
David Horak
committed
* New feature: Route redirection.
* Router View component now supports the exact matching for active class. * Bugfix: Navigation to root named route.
1 parent afdf4d9 commit 3eb9cb4

22 files changed

+1124
-74
lines changed

changelog.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
11
# Svelte Router changelog
22

3+
## 1.0.7
4+
5+
* New feature: Route redirection.
6+
* Router View component now supports the exact matching for active class.
7+
* Bugfix: Navigation to root named route.
8+
39
## 1.0.6
410

5-
* Bugfix: router properly handles basename passed as router config.
11+
* Bugfix: Router properly handles basename passed as router config.
612

713
## 1.0.5
814

component/link.svelte

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,13 @@
55
*/
66
77
import tc from '@spaceavocado/type-check';
8-
import {router, urlMatch, trimPrefix} from '@spaceavocado/svelte-router';
8+
import {router, urlMatch, urlPrefix, trimPrefix} from '@spaceavocado/svelte-router';
99
import {onMount, onDestroy, createEventDispatcher} from 'svelte';
1010
1111
// Props
1212
export let to;
1313
export let replace = false;
14+
export let exact = false;
1415
export let cls = '';
1516
export let activeClass = null;
1617
@@ -39,7 +40,10 @@
3940
onMount(() => {
4041
setCssClass(false);
4142
navigationChangedListener = $router.onNavigationChanged((fromRoute, toRoute) => {
42-
setCssClass(urlMatch(toRoute.fullPath, matchUrl));
43+
setCssClass(exact
44+
? urlMatch(toRoute.fullPath, matchUrl)
45+
: urlPrefix(toRoute.fullPath, matchUrl)
46+
);
4347
});
4448
});
4549
onDestroy(() => {

docs/history.js.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727

2828
<nav >
2929

30-
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="module-svelte-router.Router.html">Router</a><ul class='methods'><li data-type='method'><a href="module-svelte-router.Router.html#back">back</a></li><li data-type='method'><a href="module-svelte-router.Router.html#forward">forward</a></li><li data-type='method'><a href="module-svelte-router.Router.html#go">go</a></li><li data-type='method'><a href="module-svelte-router.Router.html#navigationGuard">navigationGuard</a></li><li data-type='method'><a href="module-svelte-router.Router.html#onError">onError</a></li><li data-type='method'><a href="module-svelte-router.Router.html#onNavigationChanged">onNavigationChanged</a></li><li data-type='method'><a href="module-svelte-router.Router.html#push">push</a></li><li data-type='method'><a href="module-svelte-router.Router.html#replace">replace</a></li><li data-type='method'><a href="module-svelte-router.Router.html#routeURL">routeURL</a></li><li data-type='method'><a href="module-svelte-router.Router.html#start">start</a></li></ul></li></ul><h3>Modules</h3><ul><li><a href="module-svelte-router.html">svelte-router</a></li><li><a href="module-svelte-router_history.html">svelte-router/history</a><ul class='methods'><li data-type='method'><a href="module-svelte-router_history.html#~history">history</a></li></ul></li><li><a href="module-svelte-router_location.html">svelte-router/location</a><ul class='methods'><li data-type='method'><a href="module-svelte-router_location.html#.createLocation">createLocation</a></li></ul></li><li><a href="module-svelte-router_route.html">svelte-router/route</a><ul class='methods'><li data-type='method'><a href="module-svelte-router_route.html#.cloneRoute">cloneRoute</a></li><li data-type='method'><a href="module-svelte-router_route.html#.createRoute">createRoute</a></li><li data-type='method'><a href="module-svelte-router_route.html#.createRouteConfig">createRouteConfig</a></li><li data-type='method'><a href="module-svelte-router_route.html#.createRouteRecord">createRouteRecord</a></li></ul></li><li><a href="module-svelte-router_utils.html">svelte-router/utils</a><ul class='methods'><li data-type='method'><a href="module-svelte-router_utils.html#.deepClone">deepClone</a></li><li data-type='method'><a href="module-svelte-router_utils.html#.fullURL">fullURL</a></li><li data-type='method'><a href="module-svelte-router_utils.html#.hasPrefix">hasPrefix</a></li><li data-type='method'><a href="module-svelte-router_utils.html#.hasSuffix">hasSuffix</a></li><li data-type='method'><a href="module-svelte-router_utils.html#.historyFullURL">historyFullURL</a></li><li data-type='method'><a href="module-svelte-router_utils.html#.joinPath">joinPath</a></li><li data-type='method'><a href="module-svelte-router_utils.html#.parseURL">parseURL</a></li><li data-type='method'><a href="module-svelte-router_utils.html#.urlMatch">urlMatch</a></li></ul></li></ul>
30+
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="module-svelte-router.Router.html">Router</a><ul class='methods'><li data-type='method'><a href="module-svelte-router.Router.html#_resolveRedirect">_resolveRedirect</a></li><li data-type='method'><a href="module-svelte-router.Router.html#back">back</a></li><li data-type='method'><a href="module-svelte-router.Router.html#forward">forward</a></li><li data-type='method'><a href="module-svelte-router.Router.html#go">go</a></li><li data-type='method'><a href="module-svelte-router.Router.html#navigationGuard">navigationGuard</a></li><li data-type='method'><a href="module-svelte-router.Router.html#onError">onError</a></li><li data-type='method'><a href="module-svelte-router.Router.html#onNavigationChanged">onNavigationChanged</a></li><li data-type='method'><a href="module-svelte-router.Router.html#push">push</a></li><li data-type='method'><a href="module-svelte-router.Router.html#replace">replace</a></li><li data-type='method'><a href="module-svelte-router.Router.html#routeURL">routeURL</a></li><li data-type='method'><a href="module-svelte-router.Router.html#start">start</a></li></ul></li></ul><h3>Modules</h3><ul><li><a href="module-svelte-router.html">svelte-router</a></li><li><a href="module-svelte-router_history.html">svelte-router/history</a><ul class='methods'><li data-type='method'><a href="module-svelte-router_history.html#~history">history</a></li></ul></li><li><a href="module-svelte-router_location.html">svelte-router/location</a><ul class='methods'><li data-type='method'><a href="module-svelte-router_location.html#.createLocation">createLocation</a></li></ul></li><li><a href="module-svelte-router_route.html">svelte-router/route</a><ul class='methods'><li data-type='method'><a href="module-svelte-router_route.html#.cloneRoute">cloneRoute</a></li><li data-type='method'><a href="module-svelte-router_route.html#.createRoute">createRoute</a></li><li data-type='method'><a href="module-svelte-router_route.html#.createRouteConfig">createRouteConfig</a></li><li data-type='method'><a href="module-svelte-router_route.html#.createRouteRecord">createRouteRecord</a></li></ul></li><li><a href="module-svelte-router_utils.html">svelte-router/utils</a><ul class='methods'><li data-type='method'><a href="module-svelte-router_utils.html#.deepClone">deepClone</a></li><li data-type='method'><a href="module-svelte-router_utils.html#.fullURL">fullURL</a></li><li data-type='method'><a href="module-svelte-router_utils.html#.hasPrefix">hasPrefix</a></li><li data-type='method'><a href="module-svelte-router_utils.html#.hasSuffix">hasSuffix</a></li><li data-type='method'><a href="module-svelte-router_utils.html#.historyFullURL">historyFullURL</a></li><li data-type='method'><a href="module-svelte-router_utils.html#.joinPath">joinPath</a></li><li data-type='method'><a href="module-svelte-router_utils.html#.parseURL">parseURL</a></li><li data-type='method'><a href="module-svelte-router_utils.html#.trimPrefix">trimPrefix</a></li><li data-type='method'><a href="module-svelte-router_utils.html#.urlMatch">urlMatch</a></li><li data-type='method'><a href="module-svelte-router_utils.html#.urlPrefix">urlPrefix</a></li></ul></li></ul>
3131
</nav>
3232

3333
<div id="main">
@@ -130,7 +130,7 @@ <h1 class="page-title">history.js</h1>
130130
<br class="clear">
131131

132132
<footer>
133-
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Fri Aug 09 2019 23:09:15 GMT-0400 (Eastern Daylight Time) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
133+
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Sun Aug 11 2019 11:47:39 GMT-0400 (Eastern Daylight Time) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
134134
</footer>
135135

136136
<script>prettyPrint();</script>

docs/index.html

Lines changed: 50 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727

2828
<nav >
2929

30-
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="module-svelte-router.Router.html">Router</a><ul class='methods'><li data-type='method'><a href="module-svelte-router.Router.html#back">back</a></li><li data-type='method'><a href="module-svelte-router.Router.html#forward">forward</a></li><li data-type='method'><a href="module-svelte-router.Router.html#go">go</a></li><li data-type='method'><a href="module-svelte-router.Router.html#navigationGuard">navigationGuard</a></li><li data-type='method'><a href="module-svelte-router.Router.html#onError">onError</a></li><li data-type='method'><a href="module-svelte-router.Router.html#onNavigationChanged">onNavigationChanged</a></li><li data-type='method'><a href="module-svelte-router.Router.html#push">push</a></li><li data-type='method'><a href="module-svelte-router.Router.html#replace">replace</a></li><li data-type='method'><a href="module-svelte-router.Router.html#routeURL">routeURL</a></li><li data-type='method'><a href="module-svelte-router.Router.html#start">start</a></li></ul></li></ul><h3>Modules</h3><ul><li><a href="module-svelte-router.html">svelte-router</a></li><li><a href="module-svelte-router_history.html">svelte-router/history</a><ul class='methods'><li data-type='method'><a href="module-svelte-router_history.html#~history">history</a></li></ul></li><li><a href="module-svelte-router_location.html">svelte-router/location</a><ul class='methods'><li data-type='method'><a href="module-svelte-router_location.html#.createLocation">createLocation</a></li></ul></li><li><a href="module-svelte-router_route.html">svelte-router/route</a><ul class='methods'><li data-type='method'><a href="module-svelte-router_route.html#.cloneRoute">cloneRoute</a></li><li data-type='method'><a href="module-svelte-router_route.html#.createRoute">createRoute</a></li><li data-type='method'><a href="module-svelte-router_route.html#.createRouteConfig">createRouteConfig</a></li><li data-type='method'><a href="module-svelte-router_route.html#.createRouteRecord">createRouteRecord</a></li></ul></li><li><a href="module-svelte-router_utils.html">svelte-router/utils</a><ul class='methods'><li data-type='method'><a href="module-svelte-router_utils.html#.deepClone">deepClone</a></li><li data-type='method'><a href="module-svelte-router_utils.html#.fullURL">fullURL</a></li><li data-type='method'><a href="module-svelte-router_utils.html#.hasPrefix">hasPrefix</a></li><li data-type='method'><a href="module-svelte-router_utils.html#.hasSuffix">hasSuffix</a></li><li data-type='method'><a href="module-svelte-router_utils.html#.historyFullURL">historyFullURL</a></li><li data-type='method'><a href="module-svelte-router_utils.html#.joinPath">joinPath</a></li><li data-type='method'><a href="module-svelte-router_utils.html#.parseURL">parseURL</a></li><li data-type='method'><a href="module-svelte-router_utils.html#.urlMatch">urlMatch</a></li></ul></li></ul>
30+
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="module-svelte-router.Router.html">Router</a><ul class='methods'><li data-type='method'><a href="module-svelte-router.Router.html#_resolveRedirect">_resolveRedirect</a></li><li data-type='method'><a href="module-svelte-router.Router.html#back">back</a></li><li data-type='method'><a href="module-svelte-router.Router.html#forward">forward</a></li><li data-type='method'><a href="module-svelte-router.Router.html#go">go</a></li><li data-type='method'><a href="module-svelte-router.Router.html#navigationGuard">navigationGuard</a></li><li data-type='method'><a href="module-svelte-router.Router.html#onError">onError</a></li><li data-type='method'><a href="module-svelte-router.Router.html#onNavigationChanged">onNavigationChanged</a></li><li data-type='method'><a href="module-svelte-router.Router.html#push">push</a></li><li data-type='method'><a href="module-svelte-router.Router.html#replace">replace</a></li><li data-type='method'><a href="module-svelte-router.Router.html#routeURL">routeURL</a></li><li data-type='method'><a href="module-svelte-router.Router.html#start">start</a></li></ul></li></ul><h3>Modules</h3><ul><li><a href="module-svelte-router.html">svelte-router</a></li><li><a href="module-svelte-router_history.html">svelte-router/history</a><ul class='methods'><li data-type='method'><a href="module-svelte-router_history.html#~history">history</a></li></ul></li><li><a href="module-svelte-router_location.html">svelte-router/location</a><ul class='methods'><li data-type='method'><a href="module-svelte-router_location.html#.createLocation">createLocation</a></li></ul></li><li><a href="module-svelte-router_route.html">svelte-router/route</a><ul class='methods'><li data-type='method'><a href="module-svelte-router_route.html#.cloneRoute">cloneRoute</a></li><li data-type='method'><a href="module-svelte-router_route.html#.createRoute">createRoute</a></li><li data-type='method'><a href="module-svelte-router_route.html#.createRouteConfig">createRouteConfig</a></li><li data-type='method'><a href="module-svelte-router_route.html#.createRouteRecord">createRouteRecord</a></li></ul></li><li><a href="module-svelte-router_utils.html">svelte-router/utils</a><ul class='methods'><li data-type='method'><a href="module-svelte-router_utils.html#.deepClone">deepClone</a></li><li data-type='method'><a href="module-svelte-router_utils.html#.fullURL">fullURL</a></li><li data-type='method'><a href="module-svelte-router_utils.html#.hasPrefix">hasPrefix</a></li><li data-type='method'><a href="module-svelte-router_utils.html#.hasSuffix">hasSuffix</a></li><li data-type='method'><a href="module-svelte-router_utils.html#.historyFullURL">historyFullURL</a></li><li data-type='method'><a href="module-svelte-router_utils.html#.joinPath">joinPath</a></li><li data-type='method'><a href="module-svelte-router_utils.html#.parseURL">parseURL</a></li><li data-type='method'><a href="module-svelte-router_utils.html#.trimPrefix">trimPrefix</a></li><li data-type='method'><a href="module-svelte-router_utils.html#.urlMatch">urlMatch</a></li><li data-type='method'><a href="module-svelte-router_utils.html#.urlPrefix">urlPrefix</a></li></ul></li></ul>
3131
</nav>
3232

3333
<div id="main">
@@ -80,6 +80,7 @@ <h3> </h3>
8080
<li><a href="#setup-the-router">Setup the Router</a></li>
8181
<li><a href="#route-configuration">Route Configuration</a></li>
8282
<li><a href="#dynamic-route-configuration">Dynamic Route Configuration</a></li>
83+
<li><a href="#route-redirection">Route Redirection</a></li>
8384
<li><a href="#passing-props-to-route-components">Passing Props to Route Components</a><ul>
8485
<li><a href="#automatically-pass-route-params-as-component-props">Automatically Pass Route Params as Component Props</a></li>
8586
<li><a href="#pass-custom-object-as-component-props">Pass Custom Object as Component Props</a></li>
@@ -173,6 +174,7 @@ <h2>Installation via NPM or Yarn</h2><pre class="prettyprint source lang-sh"><co
173174
}
174175
]
175176
}</code></pre><h2>Boilerplate Project Template</h2><p>For a quick start, you can use <a href="https://github.com/spaceavocado/svelte-router-template">svelte-router-template</a> - Boilerplate template project for spaceavocado/svelte-router.</p>
177+
<p><a href="https://spaceavocado.github.io/svelte-router-template/">Live Preview</a>.</p>
176178
<h2>Essentials</h2><p>Note: All code below uses ES2015+.</p>
177179
<h3>Setup the Router</h3><p>All we need to do is map our components to the routes and add root RouterView component, here's a basic example of app component uses as the main <a href="#https://svelte.dev">Svelte</a> component.</p>
178180
<p>index.js:</p>
@@ -225,6 +227,11 @@ <h3>Route Configuration</h3><p>A route can be configure with these properties:</
225227
<td style="text-align:left">string</td>
226228
</tr>
227229
<tr>
230+
<td style="text-align:left">redirect</td>
231+
<td style="text-align:left">Redirection to different route, or to external site. Please see <a href="#route-redirection">Route Redirection</a> for advanced usage.</td>
232+
<td style="text-align:left">boolean, object, function</td>
233+
</tr>
234+
<tr>
228235
<td style="text-align:left">name</td>
229236
<td style="text-align:left">The name of the current route, optional.</td>
230237
<td style="text-align:left">string</td>
@@ -297,6 +304,41 @@ <h3>Route Configuration</h3><p>A route can be configure with these properties:</
297304
<li>Special case is <code>path: '*'</code> which means any URL, this route should be the last route in your routes definition.</li>
298305
<li>All resolved dynamic parameters are accessible on the resolved route object.</li>
299306
</ul>
307+
<h3>Route Redirection</h3><p>To redirect a route, you can configure it like so:</p>
308+
<pre class="prettyprint source lang-javascript"><code>// Redirect from /a to /b
309+
{
310+
path: '/a',
311+
redirect: '/b',
312+
}
313+
314+
// External site redirect
315+
// Must start with 'http' or 'https'
316+
{
317+
path: '/a',
318+
redirect: 'https://github.com/spaceavocado/svelte-router',
319+
}
320+
321+
// Redirect to named route
322+
{
323+
path: '/a',
324+
redirect: {
325+
name: 'ROUTE_NAME',
326+
},
327+
}
328+
329+
// Dynamic redirecting
330+
// &quot;to&quot; is Route Object
331+
// Return value must be URL or a Route.
332+
{
333+
path: '/a',
334+
redirect: (to) => {
335+
return {
336+
name: 'ROUTE_NAME',
337+
}
338+
},
339+
}</code></pre><blockquote>
340+
<p>Please see <a href="#route-object">Route Object</a> for more details.</p>
341+
</blockquote>
300342
<h3>Passing Props to Route Components</h3><p>By default, props are not automatically passed to the route component, this could be change to:</p>
301343
<h4>Automatically Pass Route Params as Component Props</h4><p>All route dynamic props are auto-passed to the component.</p>
302344
<pre class="prettyprint source lang-javascript"><code>// app.svelte
@@ -400,6 +442,11 @@ <h3>Router Link Component</h3><pre class="prettyprint source lang-html"><code>&l
400442
<td style="text-align:left">boolean</td>
401443
</tr>
402444
<tr>
445+
<td style="text-align:left">exact</td>
446+
<td style="text-align:left">The default active class matching behavior is inclusive match, i.e. it matches if the URL starts with link url. In the exact mode, the url must be be the same (excluding query param and hash param). Defaults to false.</td>
447+
<td style="text-align:left">boolean</td>
448+
</tr>
449+
<tr>
403450
<td style="text-align:left">cls</td>
404451
<td style="text-align:left">Link base class name, defaults to ''.</td>
405452
<td style="text-align:left">string</td>
@@ -879,7 +926,7 @@ <h3>Pull Request Process</h3><ol>
879926
</blockquote>
880927
</li>
881928
</ol>
882-
<h2>License</h2><p>Svelte Router is released under the MIT license. See <a href="https://github.com/spaceavocado/svelte-router/blob/master/LICENSE.txt">LICENSE.txt</a></p></article>
929+
<h2>License</h2><p>Svelte Router is released under the MIT license. See <a href="https://github.com/spaceavocado/svelte-router/blob/master/LICENSE.txt">LICENSE.txt</a>.</p></article>
883930
</section>
884931

885932

@@ -894,7 +941,7 @@ <h2>License</h2><p>Svelte Router is released under the MIT license. See <a href=
894941
<br class="clear">
895942

896943
<footer>
897-
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Fri Aug 09 2019 23:09:15 GMT-0400 (Eastern Daylight Time) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
944+
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Sun Aug 11 2019 11:47:40 GMT-0400 (Eastern Daylight Time) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
898945
</footer>
899946

900947
<script>prettyPrint();</script>

0 commit comments

Comments
 (0)