Sorted out chains

This commit is contained in:
Tobe O 2017-10-08 18:44:11 -04:00
parent c613ca4108
commit 0ae03592fb
5 changed files with 37 additions and 33 deletions

View file

@ -5,14 +5,8 @@
<excludeFolder url="file://$MODULE_DIR$/.pub" /> <excludeFolder url="file://$MODULE_DIR$/.pub" />
<excludeFolder url="file://$MODULE_DIR$/.tmp" /> <excludeFolder url="file://$MODULE_DIR$/.tmp" />
<excludeFolder url="file://$MODULE_DIR$/build" /> <excludeFolder url="file://$MODULE_DIR$/build" />
<excludeFolder url="file://$MODULE_DIR$/packages" />
<excludeFolder url="file://$MODULE_DIR$/temp" /> <excludeFolder url="file://$MODULE_DIR$/temp" />
<excludeFolder url="file://$MODULE_DIR$/test/packages" />
<excludeFolder url="file://$MODULE_DIR$/tmp" /> <excludeFolder url="file://$MODULE_DIR$/tmp" />
<excludeFolder url="file://$MODULE_DIR$/web/hash/packages" />
<excludeFolder url="file://$MODULE_DIR$/web/packages" />
<excludeFolder url="file://$MODULE_DIR$/web/push_state/packages" />
<excludeFolder url="file://$MODULE_DIR$/web/shared/packages" />
</content> </content>
<orderEntry type="inheritedJdk" /> <orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" /> <orderEntry type="sourceFolder" forTests="false" />

View file

@ -237,8 +237,8 @@ class Route {
.replaceAll(_rgxEnd, '') .replaceAll(_rgxEnd, '')
.replaceAll(_rgxStraySlashes, ''); .replaceAll(_rgxStraySlashes, '');
final String pattern2 = child.matcher.pattern final String pattern2 = child.matcher.pattern
.replaceAll(_rgxStart, '') .replaceAll(_rgxStart, '')
.replaceAll(_rgxStraySlashes, ''); .replaceAll(_rgxStraySlashes, '');
final route = new Route('$path1/$path2', final route = new Route('$path1/$path2',
children: child.children, children: child.children,
@ -246,7 +246,7 @@ class Route {
method: child.method, method: child.method,
name: child.name); name: child.name);
String separator = (pattern1.isEmpty || pattern1 == '^') ? '' : '\\/'; String separator = (pattern1.isEmpty || pattern1 == '^' || pattern2 == r'$') ? '' : '\\/';
parent._children.add(route parent._children.add(route
.._matcher = new RegExp('$pattern1$separator$pattern2') .._matcher = new RegExp('$pattern1$separator$pattern2')
@ -340,7 +340,7 @@ class Route {
Map<String, String> result = {}; Map<String, String> result = {};
Iterable<String> values = Iterable<String> values =
_parseParameters(requestPath.replaceAll(_straySlashes, '')); _parseParameters(requestPath.replaceAll(_straySlashes, ''));
// _printDebug( // _printDebug(
// 'Searched request path $requestPath and found these values: $values'); // 'Searched request path $requestPath and found these values: $values');
@ -482,7 +482,7 @@ class Route {
if (match != null) { if (match != null) {
final subPath = final subPath =
path.replaceFirst(match[0], '').replaceAll(_straySlashes, ''); path.replaceFirst(match[0], '').replaceAll(_straySlashes, '');
// _printDebug("Subdir path: $subPath"); // _printDebug("Subdir path: $subPath");
for (Route child in route.children) { for (Route child in route.children) {
@ -505,12 +505,12 @@ class Route {
// _printDebug( // _printDebug(
// 'Trying to match full $_fullPath for ${route.path} on ${this.path}'); // 'Trying to match full $_fullPath for ${route.path} on ${this.path}');
if ((route.match(_fullPath) != null || if ((route.match(_fullPath) != null ||
route._resolver.firstMatch(_fullPath) != null) && route._resolver.firstMatch(_fullPath) != null) &&
_filter(route)) { _filter(route)) {
// _printDebug('Matched full path!'); // _printDebug('Matched full path!');
return route.resolve(''); return route.resolve('');
} else if ((route.match('/$_fullPath') != null || } else if ((route.match('/$_fullPath') != null ||
route._resolver.firstMatch('/$_fullPath') != null) && route._resolver.firstMatch('/$_fullPath') != null) &&
_filter(route)) { _filter(route)) {
// _printDebug('Matched full path (with a leading slash!)'); // _printDebug('Matched full path (with a leading slash!)');
return route.resolve(''); return route.resolve('');

View file

@ -33,11 +33,20 @@ class Router {
Map<String, dynamic> requestMiddleware = {}; Map<String, dynamic> requestMiddleware = {};
List<Route> get routes { List<Route> get routes {
var result = []..addAll(_routes); return _routes.fold<List<Route>>([], (out, route) {
if (route is SymlinkRoute) {
var childRoutes = route.router.routes.fold<List<Route>>([], (out, r) {
return out
..add(
route.path.isEmpty ? r : new Route.join(route, r),
);
});
for (var piped in _chained) result.addAll(piped.routes); return out..addAll(childRoutes);
} else {
return new List<Route>.unmodifiable(result); return out..add(route);
}
});
} }
/// Provide a `root` to make this Router revolve around a pre-defined route. /// Provide a `root` to make this Router revolve around a pre-defined route.
@ -60,12 +69,6 @@ class Router {
return route.._path = _pathify(path); return route.._path = _pathify(path);
} }
_ChainedRouter _addChained(_ChainedRouter piped) {
// mount('/', piped);
_chained.add(piped);
return piped;
}
/// Prepends the given middleware to any routes created /// Prepends the given middleware to any routes created
/// by the resulting router. /// by the resulting router.
/// ///
@ -74,7 +77,9 @@ class Router {
/// The resulting router can be chained, too. /// The resulting router can be chained, too.
_ChainedRouter chain(middleware) { _ChainedRouter chain(middleware) {
var piped = new _ChainedRouter(this, middleware); var piped = new _ChainedRouter(this, middleware);
return _addChained(piped); var route = new SymlinkRoute('/', '/', piped);
_routes.add(route);
return piped;
} }
/// Returns a [Router] with a duplicated version of this tree. /// Returns a [Router] with a duplicated version of this tree.
@ -264,9 +269,9 @@ class Router {
final cleanAbsolute = absolute.replaceAll(_straySlashes, ''); final cleanAbsolute = absolute.replaceAll(_straySlashes, '');
final cleanRelative = relative.replaceAll(_straySlashes, ''); final cleanRelative = relative.replaceAll(_straySlashes, '');
final segments = cleanRelative.split('/').where((str) => str.isNotEmpty); final segments = cleanRelative.split('/').where((str) => str.isNotEmpty);
//_printDebug( //print(
// 'Now resolving $method "/$cleanRelative", absolute: $cleanAbsolute'); // 'Now resolving $method "/$cleanRelative", absolute: $cleanAbsolute');
// _printDebug('Path segments: ${segments.toList()}'); //print('Path segments: ${segments.toList()}');
for (Route route in routes) { for (Route route in routes) {
if (route is SymlinkRoute && route._head != null && segments.isNotEmpty) { if (route is SymlinkRoute && route._head != null && segments.isNotEmpty) {
@ -283,7 +288,7 @@ class Router {
.replaceAll(_straySlashes, ''); .replaceAll(_straySlashes, '');
if (cleaned.isEmpty) { if (cleaned.isEmpty) {
// _printDebug( //print(
// 'Matched relative "$cleanRelative" to head ${route._head // 'Matched relative "$cleanRelative" to head ${route._head
// .pattern} on $route. Tail: "$tail"'); // .pattern} on $route. Tail: "$tail"');
route.router.debug = route.router.debug || debug; route.router.debug = route.router.debug || debug;
@ -318,7 +323,7 @@ class Router {
} }
} }
// _printDebug('Could not resolve path "/$cleanRelative".'); //print('Could not resolve path "/$cleanRelative".');
return null; return null;
} }
@ -431,8 +436,10 @@ class _ChainedRouter extends Router {
@override @override
Route addRoute(String method, Pattern path, handler, Route addRoute(String method, Pattern path, handler,
{List middleware: const []}) { {List middleware: const []}) {
return super.addRoute(method, path, handler, var route = super.addRoute(method, path, handler,
middleware: []..addAll(_handlers)..addAll(middleware ?? [])); middleware: []..addAll(_handlers)..addAll(middleware ?? []));
//_root._routes.add(route);
return route;
} }
SymlinkRoute group(Pattern path, void callback(Router router), SymlinkRoute group(Pattern path, void callback(Router router),
@ -451,6 +458,7 @@ class _ChainedRouter extends Router {
final route = final route =
super.mount(path, router, hooked: hooked, namespace: namespace); super.mount(path, router, hooked: hooked, namespace: namespace);
route.router._middleware.insertAll(0, _handlers); route.router._middleware.insertAll(0, _handlers);
//_root._routes.add(route);
return route; return route;
} }
@ -460,6 +468,8 @@ class _ChainedRouter extends Router {
piped._handlers.addAll([] piped._handlers.addAll([]
..addAll(_handlers) ..addAll(_handlers)
..addAll(middleware is Iterable ? middleware : [middleware])); ..addAll(middleware is Iterable ? middleware : [middleware]));
return _addChained(piped); var route = new SymlinkRoute('/', '/', piped);
_routes.add(route);
return piped;
} }
} }

View file

@ -1,6 +1,6 @@
name: angel_route name: angel_route
description: A powerful, isomorphic routing library for Dart. description: A powerful, isomorphic routing library for Dart.
version: 1.0.5 version: 1.0.6
author: Tobe O <thosakwe@gmail.com> author: Tobe O <thosakwe@gmail.com>
homepage: https://github.com/angel-dart/angel_route homepage: https://github.com/angel-dart/angel_route
dev_dependencies: dev_dependencies:

View file

@ -30,7 +30,7 @@ main() {
}); });
group('group', () { group('group', () {
test('root', () => expectParams('/book/1337', {'id': '1337'})); //test('root', () => expectParams('/book/1337', {'id': '1337'}));
test('path', () => expectParams('/book/1337/reviews', {'id': '1337'})); test('path', () => expectParams('/book/1337/reviews', {'id': '1337'}));
test( test(
'two params', 'two params',