fix: mount remove trailing slash requirement (#146)

fix: mount remove trailing slash requirement
diff --git a/pkgs/shelf_router/CHANGELOG.md b/pkgs/shelf_router/CHANGELOG.md
index 0dc5d5b..a8c0eb0 100644
--- a/pkgs/shelf_router/CHANGELOG.md
+++ b/pkgs/shelf_router/CHANGELOG.md
@@ -1,3 +1,7 @@
+## v1.1.2
+
+  * Remove trailing slash requirement when using `mount`.
+
 ## v1.1.1
 
  * Fix `Router.routeNotFound` to enable multiple `read()` calls on it.
diff --git a/pkgs/shelf_router/lib/src/router.dart b/pkgs/shelf_router/lib/src/router.dart
index 460ec26..9460788 100644
--- a/pkgs/shelf_router/lib/src/router.dart
+++ b/pkgs/shelf_router/lib/src/router.dart
@@ -148,16 +148,24 @@
   ///
   /// In this case prefix may not contain any parameters, nor
   void mount(String prefix, Handler handler) {
-    if (!prefix.startsWith('/') || !prefix.endsWith('/')) {
-      throw ArgumentError.value(
-          prefix, 'prefix', 'must start and end with a slash');
+    if (!prefix.startsWith('/')) {
+      throw ArgumentError.value(prefix, 'prefix', 'must start with a slash');
     }
 
     // first slash is always in request.handlerPath
     final path = prefix.substring(1);
-    all(prefix + '<path|[^]*>', (Request request) {
-      return handler(request.change(path: path));
-    });
+    if (prefix.endsWith('/')) {
+      all(prefix + '<path|[^]*>', (Request request) {
+        return handler(request.change(path: path));
+      });
+    } else {
+      all(prefix, (Request request) {
+        return handler(request.change(path: path));
+      });
+      all(prefix + '/<path|[^]*>', (Request request) {
+        return handler(request.change(path: path + '/'));
+      });
+    }
   }
 
   /// Route incoming requests to registered handlers.
diff --git a/pkgs/shelf_router/pubspec.yaml b/pkgs/shelf_router/pubspec.yaml
index 5e93b19..99a1e46 100644
--- a/pkgs/shelf_router/pubspec.yaml
+++ b/pkgs/shelf_router/pubspec.yaml
@@ -1,5 +1,5 @@
 name: shelf_router
-version: 1.1.1
+version: 1.1.2
 description: |
   A convinent request router for the shelf web-framework, with support for
   URL-parameters, nested routers and routers generated from source annotations.
diff --git a/pkgs/shelf_router/test/router_test.dart b/pkgs/shelf_router/test/router_test.dart
index 6f9b316..f664f56 100644
--- a/pkgs/shelf_router/test/router_test.dart
+++ b/pkgs/shelf_router/test/router_test.dart
@@ -148,6 +148,36 @@
     expect(await get('/api/hello?ok'), 'middleware');
   });
 
+  test('mount(Router) does not require a trailing slash', () async {
+    var api = Router();
+    api.get('/', (Request request) {
+      return Response.ok('Hello World!');
+    });
+
+    api.get('/user/<user>/info', (Request request, String user) {
+      return Response.ok('Hello $user');
+    });
+
+    var app = Router();
+    app.get('/hello', (Request request) {
+      return Response.ok('hello-world');
+    });
+
+    app.mount('/api', api);
+
+    app.all('/<_|[^]*>', (Request request) {
+      return Response.ok('catch-all-handler');
+    });
+
+    server.mount(app);
+
+    expect(await get('/hello'), 'hello-world');
+    expect(await get('/api'), 'Hello World!');
+    expect(await get('/api/'), 'Hello World!');
+    expect(await get('/api/user/jonasfj/info'), 'Hello jonasfj');
+    expect(await get('/api/user/jonasfj/info-wrong'), 'catch-all-handler');
+  });
+
   test('responds with 404 if no handler matches', () {
     var api = Router()..get('/hello', (request) => Response.ok('Hello'));
     server.mount(api);