From 5d722a604121641b19e5513a2ff07c570ab9c55e Mon Sep 17 00:00:00 2001 From: thomashii Date: Thu, 18 Mar 2021 08:11:45 +0800 Subject: [PATCH] Updated Angel Route to Null Safety --- packages/route/.idea/misc.xml | 6 -- packages/route/.idea/modules.xml | 8 -- .../runConfigurations/tests_in_route.xml | 8 -- packages/route/example/main.dart | 2 +- packages/route/lib/browser.dart | 48 ++++++------ packages/route/lib/src/grammar.dart | 70 +++++++++--------- .../route/lib/src/middleware_pipeline.dart | 4 +- packages/route/lib/src/route.dart | 32 ++++---- packages/route/lib/src/router.dart | 74 +++++++++---------- packages/route/lib/src/routing_result.dart | 34 ++++----- packages/route/pubspec.yaml | 13 ++-- packages/route/test/chain_nest_test.dart | 2 +- packages/route/test/parse_test.dart | 4 +- packages/route/test/server_test.dart | 46 ++++++------ packages/route/test/wildcard_test.dart | 6 +- packages/route/web/shared/basic.dart | 10 +-- 16 files changed, 174 insertions(+), 193 deletions(-) delete mode 100644 packages/route/.idea/misc.xml delete mode 100644 packages/route/.idea/modules.xml delete mode 100644 packages/route/.idea/runConfigurations/tests_in_route.xml diff --git a/packages/route/.idea/misc.xml b/packages/route/.idea/misc.xml deleted file mode 100644 index 639900d1..00000000 --- a/packages/route/.idea/misc.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/packages/route/.idea/modules.xml b/packages/route/.idea/modules.xml deleted file mode 100644 index b6a601b4..00000000 --- a/packages/route/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/packages/route/.idea/runConfigurations/tests_in_route.xml b/packages/route/.idea/runConfigurations/tests_in_route.xml deleted file mode 100644 index 9f2a66b3..00000000 --- a/packages/route/.idea/runConfigurations/tests_in_route.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - \ No newline at end of file diff --git a/packages/route/example/main.dart b/packages/route/example/main.dart index 7390c125..b0352ac2 100644 --- a/packages/route/example/main.dart +++ b/packages/route/example/main.dart @@ -12,7 +12,7 @@ main() { router.get('/ordinal/int:n([0-9]+)st', () {}); print(router.resolveAbsolute('/whois/~thosakwe').first.allParams); - print(router.resolveAbsolute('/wild_thornberrys').first.route.path); + print(router.resolveAbsolute('/wild_thornberrys').first.route!.path); print(router.resolveAbsolute('/ordinal/1st').first.allParams); router.get('/users', () {}); diff --git a/packages/route/lib/browser.dart b/packages/route/lib/browser.dart index 81969d66..eb54fe45 100644 --- a/packages/route/lib/browser.dart +++ b/packages/route/lib/browser.dart @@ -11,10 +11,10 @@ final RegExp _straySlashes = RegExp(r'(^/+)|(/+$)'); /// A variation of the [Router] support both hash routing and push state. abstract class BrowserRouter extends Router { /// Fires whenever the active route changes. Fires `null` if none is selected (404). - Stream> get onResolve; + Stream?> get onResolve; /// Fires whenever the active route changes. Fires `null` if none is selected (404). - Stream> get onRoute; + Stream?> get onRoute; /// Set `hash` to true to use hash routing instead of push state. /// `listen` as `true` will call `listen` after initialization. @@ -26,7 +26,7 @@ abstract class BrowserRouter extends Router { BrowserRouter._() : super(); - void _goTo(String path); + void _goTo(String? path); /// Navigates to the path generated by calling /// [navigate] with the given [linkParams]. @@ -41,26 +41,26 @@ abstract class BrowserRouter extends Router { void listen(); /// Identical to [all]. - Route on(String path, T handler, {Iterable middleware}); + Route on(String path, T handler, {Iterable? middleware}); } abstract class _BrowserRouterImpl extends Router implements BrowserRouter { bool _listening = false; - Route _current; - StreamController> _onResolve = - StreamController>(); - StreamController> _onRoute = StreamController>(); + Route? _current; + StreamController?> _onResolve = + StreamController?>(); + StreamController?> _onRoute = StreamController?>(); - Route get currentRoute => _current; + Route? get currentRoute => _current; @override - Stream> get onResolve => _onResolve.stream; + Stream?> get onResolve => _onResolve.stream; @override - Stream> get onRoute => _onRoute.stream; + Stream?> get onRoute => _onRoute.stream; - _BrowserRouterImpl({bool listen}) : super() { + _BrowserRouterImpl({bool? listen}) : super() { if (listen != false) this.listen(); prepareAnchors(); } @@ -68,7 +68,7 @@ abstract class _BrowserRouterImpl extends Router @override void go(Iterable linkParams) => _goTo(navigate(linkParams)); - Route on(String path, T handler, {Iterable middleware}) => + Route on(String path, T handler, {Iterable? middleware}) => all(path, handler, middleware: middleware); void prepareAnchors() { @@ -105,18 +105,18 @@ abstract class _BrowserRouterImpl extends Router } class _HashRouter extends _BrowserRouterImpl { - _HashRouter({bool listen}) : super(listen: listen) { + _HashRouter({required bool listen}) : super(listen: listen) { if (listen) this.listen(); } @override - void _goTo(String uri) { + void _goTo(String? uri) { window.location.hash = '#$uri'; } void handleHash([_]) { final path = window.location.hash.replaceAll(_hash, ''); - var allResolved = resolveAbsolute(path); + Iterable> allResolved = resolveAbsolute(path); final resolved = allResolved.isEmpty ? null : allResolved.first; @@ -130,7 +130,7 @@ class _HashRouter extends _BrowserRouterImpl { } void handlePath(String path) { - final resolved = resolveAbsolute(path).first; + final RoutingResult resolved = resolveAbsolute(path).first; if (resolved == null) { _onResolve.add(null); @@ -149,9 +149,9 @@ class _HashRouter extends _BrowserRouterImpl { } class _PushStateRouter extends _BrowserRouterImpl { - String _basePath; + String? _basePath; - _PushStateRouter({bool listen, Route root}) : super(listen: listen) { + _PushStateRouter({required bool listen, Route? root}) : super(listen: listen) { var $base = window.document.querySelector('base[href]') as BaseElement; if ($base?.href?.isNotEmpty != true) { @@ -163,19 +163,19 @@ class _PushStateRouter extends _BrowserRouterImpl { } @override - void _goTo(String uri) { - final resolved = resolveAbsolute(uri).first; + void _goTo(String? uri) { + final RoutingResult resolved = resolveAbsolute(uri).first; var relativeUri = uri; if (_basePath?.isNotEmpty == true) { - relativeUri = p.join(_basePath, uri.replaceAll(_straySlashes, '')); + relativeUri = p.join(_basePath!, uri!.replaceAll(_straySlashes, '')); } if (resolved == null) { _onResolve.add(null); _onRoute.add(_current = null); } else { - final route = resolved.route; + final route = resolved.route!; window.history.pushState({'path': route.path, 'params': {}}, route.name ?? route.path, relativeUri); _onResolve.add(resolved); @@ -186,7 +186,7 @@ class _PushStateRouter extends _BrowserRouterImpl { void handleState(state) { if (state is Map && state.containsKey('path')) { var path = state['path'].toString(); - final resolved = resolveAbsolute(path).first; + final RoutingResult resolved = resolveAbsolute(path).first; if (resolved != null && resolved.route != _current) { //properties.addAll(state['properties'] ?? {}); diff --git a/packages/route/lib/src/grammar.dart b/packages/route/lib/src/grammar.dart index dbb36a74..e2974c15 100644 --- a/packages/route/lib/src/grammar.dart +++ b/packages/route/lib/src/grammar.dart @@ -4,14 +4,14 @@ class RouteGrammar { static const String notSlashRgx = r'([^/]+)'; //static final RegExp rgx = RegExp(r'\((.+)\)'); static final Parser notSlash = - match(RegExp(notSlashRgx)).value((r) => r.span.text); + match(RegExp(notSlashRgx)).value((r) => r.span!.text); - static final Parser regExp = - match(RegExp(r'\(([^\n)]+)\)([^/]+)?')) + static final Parser regExp = + match(RegExp(r'\(([^\n)]+)\)([^/]+)?')) .value((r) => r.scanner.lastMatch); - static final Parser parameterName = - match(RegExp('$notSlashRgx?' r':([A-Za-z0-9_]+)' r'([^(/\n])?')) + static final Parser parameterName = + match(RegExp('$notSlashRgx?' r':([A-Za-z0-9_]+)' r'([^(/\n])?')) .value((r) => r.scanner.lastMatch); static final Parser parameterSegment = chain([ @@ -19,12 +19,12 @@ class RouteGrammar { match('?').value((r) => true).opt(), regExp.opt(), ]).map((r) { - var match = r.value[0] as Match; - var rgxMatch = r.value[2] as Match; + var match = r.value![0] as Match; + var rgxMatch = r.value![2] as Match?; var pre = match[1] ?? ''; var post = match[3] ?? ''; - RegExp rgx; + RegExp? rgx; if (rgxMatch != null) { rgx = RegExp('(${rgxMatch[1]})'); @@ -41,23 +41,23 @@ class RouteGrammar { } var s = ParameterSegment(match[2], rgx); - return r.value[1] == true ? OptionalSegment(s) : s; + return r.value![1] == true ? OptionalSegment(s) : s; }); static final Parser parsedParameterSegment = chain([ match(RegExp(r'(int|num|double)'), errorMessage: 'Expected "int","double", or "num".') - .map((r) => r.span.text), + .map((r) => r.span!.text), parameterSegment, ]).map((r) { return ParsedParameterSegment( - r.value[0] as String, r.value[1] as ParameterSegment); + r.value![0] as String, r.value![1] as ParameterSegment); }); static final Parser wildcardSegment = match(RegExp('$notSlashRgx?' r'\*' '$notSlashRgx?')) .value((r) { - var m = r.scanner.lastMatch; + var m = r.scanner.lastMatch!; var pre = m[1] ?? ''; var post = m[2] ?? ''; return WildcardSegment(pre, post); @@ -95,8 +95,8 @@ class RouteDefinition { RouteDefinition(this.segments); - Parser compile() { - Parser out; + Parser? compile() { + Parser? out; for (int i = 0; i < segments.length; i++) { var s = segments[i]; @@ -116,7 +116,7 @@ class RouteDefinition { abstract class RouteSegment { Parser compile(bool isLast); - Parser compileNext(Parser p, bool isLast); + Parser compileNext(Parser p, bool isLast); } class SlashSegment implements RouteSegment { @@ -139,7 +139,7 @@ class SlashSegment implements RouteSegment { } class ConstantSegment extends RouteSegment { - final String text; + final String? text; ConstantSegment(this.text); @@ -150,7 +150,7 @@ class ConstantSegment extends RouteSegment { @override Parser compile(bool isLast) { - return match(text).map((r) => RouteResult({})); + return match(text!).map((r) => RouteResult({})); } @override @@ -183,13 +183,13 @@ class WildcardSegment extends RouteSegment { @override Parser compile(bool isLast) { return match(_compile(isLast)) - .map((r) => RouteResult({}, tail: r.scanner.lastMatch[1])); + .map((r) => RouteResult({}, tail: r.scanner.lastMatch![1])); } @override Parser compileNext(Parser p, bool isLast) { return p.then(compile(isLast)).map((r) { - var items = r.value.cast(); + var items = r.value!.cast(); var a = items[0], b = items[1]; return a ..addAll(b?.params ?? {}) @@ -214,44 +214,44 @@ class OptionalSegment extends ParameterSegment { } @override - Parser compileNext(Parser p, bool isLast) { + Parser compileNext(Parser p, bool isLast) { return p.then(_compile().opt()).map((r) { - if (r.value[1] == null) return r.value[0] as RouteResult; - return (r.value[0] as RouteResult) - ..addAll({name: Uri.decodeComponent(r.value[1] as String)}); + if (r.value![1] == null) return r.value![0] as RouteResult?; + return (r.value![0] as RouteResult) + ..addAll({name: Uri.decodeComponent(r.value![1] as String)}); }); } } class ParameterSegment extends RouteSegment { - final String name; - final RegExp regExp; + final String? name; + final RegExp? regExp; ParameterSegment(this.name, this.regExp); @override String toString() { - if (regExp != null) return 'Param: $name (${regExp.pattern})'; + if (regExp != null) return 'Param: $name (${regExp!.pattern})'; return 'Param: $name'; } - Parser _compile() { + Parser _compile() { return regExp != null - ? match(regExp).value((r) => r.scanner.lastMatch[1]) + ? match(regExp!).value((r) => r.scanner.lastMatch![1]) : RouteGrammar.notSlash; } @override Parser compile(bool isLast) { return _compile() - .map((r) => RouteResult({name: Uri.decodeComponent(r.value)})); + .map((r) => RouteResult({name: Uri.decodeComponent(r.value!)})); } @override - Parser compileNext(Parser p, bool isLast) { + Parser compileNext(Parser p, bool isLast) { return p.then(_compile()).map((r) { - return (r.value[0] as RouteResult) - ..addAll({name: Uri.decodeComponent(r.value[1] as String)}); + return (r.value![0] as RouteResult) + ..addAll({name: Uri.decodeComponent(r.value![1] as String)}); }); } } @@ -276,15 +276,15 @@ class ParsedParameterSegment extends RouteSegment { @override Parser compile(bool isLast) { return parameter._compile().map((r) => RouteResult( - {parameter.name: getValue(Uri.decodeComponent(r.span.text))})); + {parameter.name: getValue(Uri.decodeComponent(r.span!.text))})); } @override Parser compileNext(Parser p, bool isLast) { return p.then(parameter._compile()).map((r) { - return (r.value[0] as RouteResult) + return (r.value![0] as RouteResult) ..addAll({ - parameter.name: getValue(Uri.decodeComponent(r.value[1] as String)) + parameter.name: getValue(Uri.decodeComponent(r.value![1] as String)) }); }); } diff --git a/packages/route/lib/src/middleware_pipeline.dart b/packages/route/lib/src/middleware_pipeline.dart index afb1b9e4..cf44f78c 100644 --- a/packages/route/lib/src/middleware_pipeline.dart +++ b/packages/route/lib/src/middleware_pipeline.dart @@ -4,10 +4,10 @@ import 'router.dart'; class MiddlewarePipeline { /// All the possible routes that matched the given path. final Iterable> routingResults; - List _handlers; + List? _handlers; /// An ordered list of every handler delegated to handle this request. - List get handlers { + List? get handlers { if (_handlers != null) return _handlers; final handlers = []; diff --git a/packages/route/lib/src/route.dart b/packages/route/lib/src/route.dart index b20b50c9..2989e36a 100644 --- a/packages/route/lib/src/route.dart +++ b/packages/route/lib/src/route.dart @@ -2,17 +2,17 @@ part of angel_route.src.router; /// Represents a virtual location within an application. class Route { - final String method; + final String? method; final String path; - final List handlers; + final List? handlers; final Map> _cache = {}; - final RouteDefinition _routeDefinition; - String name; - Parser _parser; + final RouteDefinition? _routeDefinition; + String? name; + Parser? _parser; - Route(this.path, {@required this.method, @required this.handlers}) + Route(this.path, {required this.method, required this.handlers}) : _routeDefinition = RouteGrammar.routeDefinition - .parse(SpanScanner(path.replaceAll(_straySlashes, ''))) + .parse(SpanScanner(path.replaceAll(_straySlashes, '')))! .value { if (_routeDefinition?.segments?.isNotEmpty != true) { _parser = match('').map((r) => RouteResult({})); @@ -26,7 +26,7 @@ class Route { method: b.method, handlers: b.handlers); } - Parser get parser => _parser ??= _routeDefinition.compile(); + Parser? get parser => _parser ??= _routeDefinition!.compile(); @override String toString() { @@ -42,7 +42,7 @@ class Route { var b = StringBuffer(); int i = 0; - for (var seg in _routeDefinition.segments) { + for (var seg in _routeDefinition!.segments) { if (i++ > 0) b.write('/'); if (seg is ConstantSegment) { b.write(seg.text); @@ -50,7 +50,7 @@ class Route { if (!params.containsKey(seg.name)) { throw ArgumentError('Missing parameter "${seg.name}".'); } - b.write(params[seg.name]); + b.write(params[seg.name!]); } } @@ -61,19 +61,19 @@ class Route { /// The result of matching an individual route. class RouteResult { /// The parsed route parameters. - final Map params; + final Map params; /// Optional. An explicit "tail" value to set. - String get tail => _tail; + String? get tail => _tail; - String _tail; + String? _tail; - RouteResult(this.params, {String tail}) : _tail = tail; + RouteResult(this.params, {String? tail}) : _tail = tail; - void _setTail(String v) => _tail ??= v; + void _setTail(String? v) => _tail ??= v; /// Adds parameters. - void addAll(Map map) { + void addAll(Map map) { params.addAll(map); } } diff --git a/packages/route/lib/src/router.dart b/packages/route/lib/src/router.dart index 9d6e4f1c..986844d4 100644 --- a/packages/route/lib/src/router.dart +++ b/packages/route/lib/src/router.dart @@ -65,8 +65,8 @@ class Router { /// Adds a route that responds to the given path /// for requests with the given method (case-insensitive). /// Provide '*' as the method to respond to all methods. - Route addRoute(String method, String path, T handler, - {Iterable middleware}) { + Route addRoute(String? method, String path, T handler, + {Iterable? middleware}) { middleware ??= []; if (_useCache == true) { throw StateError('Cannot add routes after caching is enabled.'); @@ -115,7 +115,7 @@ class Router { /// Creates a visual representation of the route hierarchy and /// passes it to a callback. If none is provided, `print` is called. void dumpTree( - {callback(String tree), + {callback(String tree)?, String header = 'Dumping route tree:', String tab = ' '}) { final buf = StringBuffer(); @@ -147,7 +147,7 @@ class Router { buf.writeln(); dumpRouter(route.router); } else { - buf.writeln(' => ${route.handlers.length} handler(s)'); + buf.writeln(' => ${route.handlers!.length} handler(s)'); } } @@ -165,7 +165,7 @@ class Router { /// Returns the created route. /// You can also register middleware within the router. SymlinkRoute group(String path, void callback(Router router), - {Iterable middleware, String name}) { + {Iterable? middleware, String? name}) { middleware ??= []; final router = Router().._middleware.addAll(middleware); callback(router); @@ -175,7 +175,7 @@ class Router { /// Asynchronous equivalent of [group]. Future> groupAsync( String path, FutureOr callback(Router router), - {Iterable middleware, String name}) async { + {Iterable? middleware, String? name}) async { middleware ??= []; final router = Router().._middleware.addAll(middleware); await callback(router); @@ -212,7 +212,7 @@ class Router { String navigate(Iterable linkParams, {bool absolute = true}) { final List segments = []; Router search = this; - Route lastRoute; + Route? lastRoute; for (final param in linkParams) { bool resolved = false; @@ -238,7 +238,7 @@ class Router { var scanner = SpanScanner(param.replaceAll(_straySlashes, '')); for (Route route in search.routes) { int pos = scanner.position; - if (route.parser.parse(scanner).successful && scanner.isDone) { + if (route.parser!.parse(scanner)!.successful && scanner.isDone) { segments.add(route.path.replaceAll(_straySlashes, '')); lastRoute = route; @@ -281,10 +281,10 @@ class Router { /// Finds the first [Route] that matches the given path, /// with the given method. - bool resolve(String absolute, String relative, List> out, + bool resolve(String? absolute, String? relative, List> out, {String method = 'GET', bool strip = true}) { final cleanRelative = - strip == false ? relative : stripStraySlashes(relative); + strip == false ? relative! : stripStraySlashes(relative!); var scanner = SpanScanner(cleanRelative); bool crawl(Router r) { @@ -294,22 +294,22 @@ class Router { int pos = scanner.position; if (route is SymlinkRoute) { - if (route.parser.parse(scanner).successful) { + if (route.parser!.parse(scanner)!.successful) { var s = crawl(route.router); if (s) success = true; } scanner.position = pos; } else if (route.method == '*' || route.method == method) { - var parseResult = route.parser.parse(scanner); + var parseResult = route.parser!.parse(scanner)!; if (parseResult.successful && scanner.isDone) { var result = RoutingResult( parseResult: parseResult, - params: parseResult.value.params, + params: parseResult.value!.params, shallowRoute: route, shallowRouter: this, - tail: (parseResult.value.tail ?? '') + scanner.rest); + tail: (parseResult.value!.tail ?? '') + scanner.rest); out.add(result); success = true; } @@ -326,13 +326,13 @@ class Router { /// Returns the result of [resolve] with [path] passed as /// both `absolute` and `relative`. - Iterable> resolveAbsolute(String path, + Iterable> resolveAbsolute(String? path, {String method = 'GET', bool strip = true}) => resolveAll(path, path, method: method, strip: strip); /// Finds every possible [Route] that matches the given path, /// with the given method. - Iterable> resolveAll(String absolute, String relative, + Iterable> resolveAll(String? absolute, String? relative, {String method = 'GET', bool strip = true}) { if (_useCache == true) { return _cache.putIfAbsent('$method$absolute', @@ -342,7 +342,7 @@ class Router { return _resolveAll(absolute, relative, method: method, strip: strip); } - Iterable> _resolveAll(String absolute, String relative, + Iterable> _resolveAll(String? absolute, String? relative, {String method = 'GET', bool strip = true}) { var results = >[]; resolve(absolute, relative, results, method: method, strip: strip); @@ -363,61 +363,61 @@ class Router { } /// Adds a route that responds to any request matching the given path. - Route all(String path, T handler, {Iterable middleware}) { + Route all(String path, T handler, {Iterable? middleware}) { return addRoute('*', path, handler, middleware: middleware); } /// Adds a route that responds to a DELETE request. - Route delete(String path, T handler, {Iterable middleware}) { + Route delete(String path, T handler, {Iterable? middleware}) { return addRoute('DELETE', path, handler, middleware: middleware); } /// Adds a route that responds to a GET request. - Route get(String path, T handler, {Iterable middleware}) { + Route get(String path, T handler, {Iterable? middleware}) { return addRoute('GET', path, handler, middleware: middleware); } /// Adds a route that responds to a HEAD request. - Route head(String path, T handler, {Iterable middleware}) { + Route head(String path, T handler, {Iterable? middleware}) { return addRoute('HEAD', path, handler, middleware: middleware); } /// Adds a route that responds to a OPTIONS request. - Route options(String path, T handler, {Iterable middleware}) { + Route options(String path, T handler, {Iterable? middleware}) { return addRoute('OPTIONS', path, handler, middleware: middleware); } /// Adds a route that responds to a POST request. - Route post(String path, T handler, {Iterable middleware}) { + Route post(String path, T handler, {Iterable? middleware}) { return addRoute('POST', path, handler, middleware: middleware); } /// Adds a route that responds to a PATCH request. - Route patch(String path, T handler, {Iterable middleware}) { + Route patch(String path, T handler, {Iterable? middleware}) { return addRoute('PATCH', path, handler, middleware: middleware); } /// Adds a route that responds to a PUT request. - Route put(String path, T handler, {Iterable middleware}) { + Route put(String path, T handler, {Iterable? middleware}) { return addRoute('PUT', path, handler, middleware: middleware); } } class _ChainedRouter extends Router { final List _handlers = []; - Router _root; + Router? _root; _ChainedRouter.empty(); - _ChainedRouter(Router root, Iterable middleware) { + _ChainedRouter(Router? root, Iterable middleware) { this._root = root; _handlers.addAll(middleware); } @override - Route addRoute(String method, String path, handler, - {Iterable middleware}) { - var route = super.addRoute(method, path, handler, + Route addRoute(String? method, String path, handler, + {Iterable? middleware}) { + Route route = super.addRoute(method, path, handler, middleware: []..addAll(_handlers)..addAll(middleware ?? [])); //_root._routes.add(route); return route; @@ -425,7 +425,7 @@ class _ChainedRouter extends Router { @override SymlinkRoute group(String path, void callback(Router router), - {Iterable middleware, String name}) { + {Iterable? middleware, String? name}) { final router = _ChainedRouter( _root, []..addAll(_handlers)..addAll(middleware ?? [])); callback(router); @@ -435,7 +435,7 @@ class _ChainedRouter extends Router { @override Future> groupAsync( String path, FutureOr callback(Router router), - {Iterable middleware, String name}) async { + {Iterable? middleware, String? name}) async { final router = _ChainedRouter( _root, []..addAll(_handlers)..addAll(middleware ?? [])); await callback(router); @@ -444,7 +444,7 @@ class _ChainedRouter extends Router { @override SymlinkRoute mount(String path, Router router) { - final route = super.mount(path, router); + final SymlinkRoute route = super.mount(path, router); route.router._middleware.insertAll(0, _handlers); //_root._routes.add(route); return route; @@ -473,13 +473,13 @@ Router flatten(Router router) { var path = route.path.replaceAll(_straySlashes, ''); var joined = '$base/$path'.replaceAll(_straySlashes, ''); flattened.addRoute(route.method, joined.replaceAll(_straySlashes, ''), - route.handlers.last, + route.handlers!.last, middleware: - route.handlers.take(route.handlers.length - 1).toList()); + route.handlers!.take(route.handlers!.length - 1).toList()); } } else { - flattened.addRoute(route.method, route.path, route.handlers.last, - middleware: route.handlers.take(route.handlers.length - 1).toList()); + flattened.addRoute(route.method, route.path, route.handlers!.last, + middleware: route.handlers!.take(route.handlers!.length - 1).toList()); } } diff --git a/packages/route/lib/src/routing_result.dart b/packages/route/lib/src/routing_result.dart index e3aafa69..5d7c4b2a 100644 --- a/packages/route/lib/src/routing_result.dart +++ b/packages/route/lib/src/routing_result.dart @@ -3,49 +3,49 @@ part of angel_route.src.router; /// Represents a complex result of navigating to a path. class RoutingResult { /// The parse result that matched the given sub-path. - final ParseResult parseResult; + final ParseResult? parseResult; /// A nested instance, if a sub-path was matched. - final Iterable> nested; + final Iterable>? nested; /// All route params matching this route on the current sub-path. - final Map params = {}; + final Map params = {}; /// The [Route] that answered this sub-path. /// /// This is mostly for internal use, and useless in production. - final Route shallowRoute; + final Route? shallowRoute; /// The [Router] that answered this sub-path. /// /// Only really for internal use. - final Router shallowRouter; + final Router? shallowRouter; /// The remainder of the full path that was not matched, and was passed to [nested] routes. final String tail; /// The [RoutingResult] that matched the most specific sub-path. RoutingResult get deepest { - var search = this; + RoutingResult search = this; while (search?.nested?.isNotEmpty == true) { - search = search.nested.first; + search = search.nested!.first; } return search; } /// The most specific route. - Route get route => deepest.shallowRoute; + Route? get route => deepest.shallowRoute; /// The most specific router. - Router get router => deepest.shallowRouter; + Router? get router => deepest.shallowRouter; /// The handlers at this sub-path. List get handlers { return [] - ..addAll(shallowRouter.middleware) - ..addAll(shallowRoute.handlers); + ..addAll(shallowRouter!.middleware) + ..addAll(shallowRoute!.handlers!); } /// All handlers on this sub-path and its children. @@ -56,7 +56,7 @@ class RoutingResult { handlers.addAll(result.handlers); if (result.nested?.isNotEmpty == true) { - for (var r in result.nested) { + for (var r in result.nested!) { crawl(r); } } @@ -68,14 +68,14 @@ class RoutingResult { } /// All parameters on this sub-path and its children. - Map get allParams { - final Map params = {}; + Map get allParams { + final Map params = {}; void crawl(RoutingResult result) { params.addAll(result.params); if (result.nested?.isNotEmpty == true) { - for (var r in result.nested) { + for (var r in result.nested!) { crawl(r); } } @@ -87,11 +87,11 @@ class RoutingResult { RoutingResult( {this.parseResult, - Map params = const {}, + Map params = const {}, this.nested, this.shallowRoute, this.shallowRouter, - @required this.tail}) { + required this.tail}) { this.params.addAll(params ?? {}); } } diff --git a/packages/route/pubspec.yaml b/packages/route/pubspec.yaml index 2f2874dd..404f7fda 100644 --- a/packages/route/pubspec.yaml +++ b/packages/route/pubspec.yaml @@ -1,14 +1,17 @@ name: angel_route description: A powerful, isomorphic routing library for Dart. It is mainly used in the Angel framework, but can be used in Flutter and on the Web. -version: 4.0.0 +version: 5.0.0 author: Tobe O homepage: https://github.com/angel-dart/angel_route +publish_to: none environment: - sdk: ">=2.10.0 <3.0.0" + sdk: '>=2.12.0 <3.0.0' dependencies: - combinator: ^1.0.0 - #meta: ^1.0.0 - #path: ^1.0.0 + combinator: + git: + url: https://github.com/dukefirehawk/angel.git + ref: sdk-2.12.x_nnbd + path: packages/combinator string_scanner: ^1.0.0 dev_dependencies: build_runner: ^1.11.5 diff --git a/packages/route/test/chain_nest_test.dart b/packages/route/test/chain_nest_test.dart index f1dfd10c..64c5b75f 100644 --- a/packages/route/test/chain_nest_test.dart +++ b/packages/route/test/chain_nest_test.dart @@ -11,7 +11,7 @@ void main() { ..dumpTree(); test('nested route groups with chain', () { - var r = router.resolveAbsolute('/b/e/f')?.first?.route; + var r = router.resolveAbsolute('/b/e/f').first.route!; expect(r, isNotNull); expect(r.handlers, hasLength(4)); expect(r.handlers, equals(['a', 'c', 'd', 'g'])); diff --git a/packages/route/test/parse_test.dart b/packages/route/test/parse_test.dart index e85a5bac..baec7da9 100644 --- a/packages/route/test/parse_test.dart +++ b/packages/route/test/parse_test.dart @@ -7,9 +7,9 @@ void main() { ..get('/double/double:id', '') ..get('/num/num:id', ''); - num getId(String path) { + num? getId(String path) { var result = router.resolveAbsolute(path).first; - return result.allParams['id'] as num; + return result.allParams['id'] as num?; } test('parse', () { diff --git a/packages/route/test/server_test.dart b/packages/route/test/server_test.dart index 28850329..3ccbdd2b 100644 --- a/packages/route/test/server_test.dart +++ b/packages/route/test/server_test.dart @@ -9,11 +9,11 @@ const List> people = [ ]; void main() { - http.Client client; + http.Client? client; final router = Router(); - HttpServer server; - String url; + late HttpServer server; + String? url; router.get('/', (req, res) { res.write('Root'); @@ -87,12 +87,12 @@ void main() { router.resolveAbsolute(req.uri.toString(), method: req.method); final pipeline = MiddlewarePipeline(results); - if (pipeline.handlers.isEmpty) { + if (pipeline.handlers!.isEmpty) { res ..statusCode = 404 ..writeln('404 Not Found'); } else { - for (final handler in pipeline.handlers) { + for (final handler in pipeline.handlers!) { if (!((await handler(req, res)) as bool)) break; } } @@ -103,7 +103,7 @@ void main() { tearDown(() async { await server.close(force: true); - client.close(); + client!.close(); client = null; url = null; }); @@ -111,13 +111,13 @@ void main() { group('top-level', () { group('get', () { test('root', () async { - final res = await client.get(Uri.parse(url)); + final res = await client!.get(Uri.parse(url!)); print('Response: ${res.body}'); expect(res.body, equals('Root')); }); test('path', () async { - final res = await client.get(Uri.parse('$url/hello')); + final res = await client!.get(Uri.parse('$url/hello')); print('Response: ${res.body}'); expect(res.body, equals('World')); }); @@ -127,20 +127,20 @@ void main() { group('group', () { group('top-level', () { test('root', () async { - final res = await client.get(Uri.parse('$url/people')); + final res = await client!.get(Uri.parse('$url/people')); print('Response: ${res.body}'); expect(json.decode(res.body), equals(people)); }); group('param', () { test('root', () async { - final res = await client.get(Uri.parse('$url/people/0')); + final res = await client!.get(Uri.parse('$url/people/0')); print('Response: ${res.body}'); expect(json.decode(res.body), equals(people.first)); }); test('path', () async { - final res = await client.get(Uri.parse('$url/people/0/name')); + final res = await client!.get(Uri.parse('$url/people/0/name')); print('Response: ${res.body}'); expect(json.decode(res.body), equals(people.first['name'])); }); @@ -151,20 +151,20 @@ void main() { group('mount', () { group('path', () { test('top-level', () async { - final res = await client.post(Uri.parse('$url/beatles/spinal_clacker')); + final res = await client!.post(Uri.parse('$url/beatles/spinal_clacker')); print('Response: ${res.body}'); expect(res.body, equals('come together')); }); test('fallback', () async { - final res = await client.patch(Uri.parse('$url/beatles/muddy_water')); + final res = await client!.patch(Uri.parse('$url/beatles/muddy_water')); print('Response: ${res.body}'); expect(res.body, equals('together')); }); test('fallback', () async { final res = - await client.patch(Uri.parse('$url/beatles/spanil_clakcer')); + await client!.patch(Uri.parse('$url/beatles/spanil_clakcer')); print('Response: ${res.body}'); expect(res.body, equals('together')); }); @@ -172,7 +172,7 @@ void main() { test('deep nested', () async { final res = - await client.get(Uri.parse('$url/beatles/big/yellow/submarine')); + await client!.get(Uri.parse('$url/beatles/big/yellow/submarine')); print('Response: ${res.body}'); expect(res.body, equals('we all live in a')); }); @@ -187,17 +187,17 @@ void main() { }); test('path', () async { - await expect404(client.get(Uri.parse('$url/foo'))); - await expect404(client.get(Uri.parse('$url/bye'))); - await expect404(client.get(Uri.parse('$url/people/0/age'))); - await expect404(client.get(Uri.parse('$url/beatles2'))); + await expect404(client!.get(Uri.parse('$url/foo'))); + await expect404(client!.get(Uri.parse('$url/bye'))); + await expect404(client!.get(Uri.parse('$url/people/0/age'))); + await expect404(client!.get(Uri.parse('$url/beatles2'))); }); test('method', () async { - await expect404(client.head(Uri.parse(url))); - await expect404(client.patch(Uri.parse('$url/people'))); - await expect404(client.post(Uri.parse('$url/people/0'))); - await expect404(client.delete(Uri.parse('$url/beatles2/spinal_clacker'))); + await expect404(client!.head(Uri.parse(url!))); + await expect404(client!.patch(Uri.parse('$url/people'))); + await expect404(client!.post(Uri.parse('$url/people/0'))); + await expect404(client!.delete(Uri.parse('$url/beatles2/spinal_clacker'))); }); }); } diff --git a/packages/route/test/wildcard_test.dart b/packages/route/test/wildcard_test.dart index a49cfcf1..e974d51b 100644 --- a/packages/route/test/wildcard_test.dart +++ b/packages/route/test/wildcard_test.dart @@ -26,21 +26,21 @@ void main() { test('tail explicitly set intermediate', () { var results = router.resolveAbsolute('/songs/in_the/key'); var result = results.first; - print(results.map((r) => {r.route.path: r.tail})); + print(results.map((r) => {r.route!.path: r.tail})); expect(result.tail, 'in_the'); }); test('tail explicitly set at end', () { var results = router.resolveAbsolute('/isnt/she/epic'); var result = results.first; - print(results.map((r) => {r.route.path: r.tail})); + print(results.map((r) => {r.route!.path: r.tail})); expect(result.tail, 'epic'); }); test('tail with trailing', () { var results = router.resolveAbsolute('/isnt/she/epic/fail'); var result = results.first; - print(results.map((r) => {r.route.path: r.tail})); + print(results.map((r) => {r.route!.path: r.tail})); expect(result.tail, 'epic/fail'); }); } diff --git a/packages/route/web/shared/basic.dart b/packages/route/web/shared/basic.dart index c3b37074..3f00c120 100644 --- a/packages/route/web/shared/basic.dart +++ b/packages/route/web/shared/basic.dart @@ -9,15 +9,15 @@ basic(BrowserRouter router) { final route = result?.route; if (route == null) { - $h1.text = 'No Active Route'; - $ul.children + $h1!.text = 'No Active Route'; + $ul!.children ..clear() ..add(LIElement()..text = '(empty)'); } else { - $h1.text = 'Active Route: ${route.name ?? route.path}'; - $ul.children + $h1!.text = 'Active Route: ${route.name ?? route.path}'; + $ul!.children ..clear() - ..addAll(result.allHandlers + ..addAll(result!.allHandlers .map((handler) => LIElement()..text = handler.toString())); } });