Enable lints, test on oldest supported SDK (#8)

diff --git a/.travis.yml b/.travis.yml
index 87adf20..ea1a353 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,14 +1,18 @@
 language: dart
-sudo: false
+
 dart:
+  - 2.0.0
   - dev
-  - stable
-  - 1.22.1
 
 dart_task:
   - test
-  - dartfmt
-  - dartanalyzer
+  - dartanalyzer: --fatal-infos --fatal-warnings .
+
+matrix:
+  include:
+    # Only validate formatting using the dev release
+    - dart: dev
+      dart_task: dartfmt
 
 # Only building master means that we don't run two builds for each pull request.
 branches:
diff --git a/analysis_options.yaml b/analysis_options.yaml
index 2b0a49b..b26ea47 100644
--- a/analysis_options.yaml
+++ b/analysis_options.yaml
@@ -1,35 +1,99 @@
+include: package:pedantic/analysis_options.yaml
+analyzer:
+  strong-mode:
+    implicit-casts: false
+  errors:
+    dead_code: error
+    override_on_non_overriding_method: error
+    unused_element: error
+    unused_import: error
+    unused_local_variable: error
 linter:
   rules:
+    - always_declare_return_types
+    - annotate_overrides
+    - avoid_bool_literals_in_conditional_expressions
+    - avoid_classes_with_only_static_members
     - avoid_empty_else
+    - avoid_function_literals_in_foreach_calls
     - avoid_init_to_null
     - avoid_null_checks_in_equality_operators
+    - avoid_relative_lib_imports
+    - avoid_renaming_method_parameters
+    - avoid_return_types_on_setters
+    - avoid_returning_null
+    - avoid_returning_null_for_future
+    - avoid_returning_null_for_void
+    - avoid_returning_this
+    - avoid_shadowing_type_parameters
+    - avoid_single_cascade_in_expression_statements
+    - avoid_types_as_parameter_names
+    - avoid_unused_constructor_parameters
     - await_only_futures
     - camel_case_types
     - cancel_subscriptions
+    - cascade_invocations
+    - comment_references
     - constant_identifier_names
     - control_flow_in_finally
     - directives_ordering
     - empty_catches
     - empty_constructor_bodies
     - empty_statements
+    - file_names
     - hash_and_equals
     - implementation_imports
+    - invariant_booleans
     - iterable_contains_unrelated_type
+    - join_return_with_assignment
     - library_names
     - library_prefixes
     - list_remove_unrelated_type
+    - literal_only_boolean_expressions
+    - no_adjacent_strings_in_list
+    - no_duplicate_case_values
     - non_constant_identifier_names
+    - null_closures
+    - omit_local_variable_types
+    - only_throw_errors
     - overridden_fields
     - package_api_docs
     - package_names
     - package_prefixed_library_names
+    - prefer_adjacent_string_concatenation
+    - prefer_collection_literals
+    - prefer_conditional_assignment
+    - prefer_const_constructors
+    - prefer_contains
+    - prefer_equal_for_default_values
     - prefer_final_fields
+    #- prefer_final_locals
+    - prefer_generic_function_type_aliases
+    - prefer_initializing_formals
+    - prefer_interpolation_to_compose_strings
+    - prefer_is_empty
     - prefer_is_not_empty
+    - prefer_null_aware_operators
+    #- prefer_single_quotes
+    - prefer_typing_uninitialized_variables
+    - recursive_getters
     - slash_for_doc_comments
-    - super_goes_last
     - test_types_in_equals
     - throw_in_finally
     - type_init_formals
+    - unawaited_futures
+    - unnecessary_await_in_return
     - unnecessary_brace_in_string_interps
+    - unnecessary_const
+    - unnecessary_getters_setters
+    - unnecessary_lambdas
+    - unnecessary_new
+    - unnecessary_null_aware_assignments
+    - unnecessary_parenthesis
+    - unnecessary_statements
+    - unnecessary_this
     - unrelated_type_equality_checks
+    - use_function_type_syntax_for_parameters
+    - use_rethrow_when_possible
     - valid_regexps
+    - void_checks
diff --git a/lib/shelf_packages_handler.dart b/lib/shelf_packages_handler.dart
index eda6203..f3b5d68 100644
--- a/lib/shelf_packages_handler.dart
+++ b/lib/shelf_packages_handler.dart
@@ -22,12 +22,12 @@
 /// This can only serve assets from `file:` URIs.
 Handler packagesHandler({PackageResolver resolver}) {
   resolver ??= PackageResolver.current;
-  return new AsyncHandler(resolver.packageRoot.then((packageRoot) {
+  return AsyncHandler(resolver.packageRoot.then((packageRoot) {
     if (packageRoot != null) {
       return createStaticHandler(p.fromUri(packageRoot),
           serveFilesOutsidePath: true);
     } else {
-      return new PackageConfigHandler(resolver);
+      return PackageConfigHandler(resolver);
     }
   }));
 }
@@ -41,4 +41,4 @@
 /// This is useful for ensuring that `package:` imports work for all entrypoints
 /// in Dartium.
 Handler packagesDirHandler({PackageResolver resolver}) =>
-    new DirHandler("packages", packagesHandler(resolver: resolver));
+    DirHandler("packages", packagesHandler(resolver: resolver));
diff --git a/lib/src/async_handler.dart b/lib/src/async_handler.dart
index 3445aca..c221aea 100644
--- a/lib/src/async_handler.dart
+++ b/lib/src/async_handler.dart
@@ -10,15 +10,16 @@
 class AsyncHandler {
   final ResultFuture<Handler> _future;
 
-  AsyncHandler(Future<Handler> future) : _future = new ResultFuture(future);
+  AsyncHandler(Future<Handler> future) : _future = ResultFuture(future);
 
   FutureOr<Response> call(Request request) {
     if (_future.result == null) {
       return _future.then((handler) => handler(request));
     }
 
-    if (_future.result.isError)
-      return new Future.error(_future.result.asError.error);
+    if (_future.result.isError) {
+      return Future.error(_future.result.asError.error);
+    }
 
     return _future.result.asValue.value(request);
   }
diff --git a/lib/src/dir_handler.dart b/lib/src/dir_handler.dart
index 47f86af..bd8bb8c 100644
--- a/lib/src/dir_handler.dart
+++ b/lib/src/dir_handler.dart
@@ -9,10 +9,12 @@
 import 'package:path/path.dart' as p;
 import 'package:shelf/shelf.dart';
 
+import 'package_config_handler.dart';
+
 /// A utility handler that mounts a sub-handler beneath a directory name,
 /// wherever that directory name appears in a URL.
 ///
-/// In practice, this is used to mount a [PackagesHandler] underneath
+/// In practice, this is used to mount a [PackageConfigHandler] underneath
 /// `packages/` directories.
 class DirHandler {
   /// The directory name to look for.
@@ -31,6 +33,6 @@
       return _inner(request.change(path: p.url.joinAll(segments.take(i + 1))));
     }
 
-    return new Response.notFound("Not found.");
+    return Response.notFound("Not found.");
   }
 }
diff --git a/lib/src/package_config_handler.dart b/lib/src/package_config_handler.dart
index 7994d48..7d192a0 100644
--- a/lib/src/package_config_handler.dart
+++ b/lib/src/package_config_handler.dart
@@ -16,10 +16,10 @@
 class PackageConfigHandler {
   /// The static handlers for serving entries in the package config, indexed by
   /// name.
-  final _packageHandlers = new Map<String, Handler>();
+  final _packageHandlers = <String, Handler>{};
 
   /// The information specifying how to do package resolution.
-  PackageResolver _resolver;
+  final PackageResolver _resolver;
 
   PackageConfigHandler(this._resolver);
 
@@ -29,12 +29,12 @@
     return _handlerFor(segments.first)(request.change(path: segments.first));
   }
 
-  /// Creates a handler for [package] based on the package map in [resolver].
+  /// Creates a handler for [package] based on the package map in [_resolver].
   Handler _handlerFor(String package) {
     return _packageHandlers.putIfAbsent(package, () {
-      return new AsyncHandler(_resolver.urlFor(package).then((url) {
+      return AsyncHandler(_resolver.urlFor(package).then((url) {
         var handler = url == null
-            ? (_) => new Response.notFound("Package $package not found.")
+            ? (_) => Response.notFound("Package $package not found.")
             : createStaticHandler(p.fromUri(url), serveFilesOutsidePath: true);
 
         return handler;
diff --git a/pubspec.yaml b/pubspec.yaml
index 7eae724..35e86e1 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,12 +1,12 @@
 name: shelf_packages_handler
-version: 1.0.4
+version: 1.0.5-dev
 
 description: A shelf handler for serving a `packages/` directory.
 author: Dart Team <misc@dartlang.org>
 homepage: https://github.com/dart-lang/shelf_packages_handler
 
 environment:
-  sdk: '>=1.22.0 <3.0.0'
+  sdk: '>=2.0.0 <3.0.0'
 
 dependencies:
   async: '>=1.1.0 <3.0.0'
@@ -16,4 +16,4 @@
   package_resolver: ^1.0.0
 
 dev_dependencies:
-  test: '>=0.12.0 <2.0.0'
+  test: '>=1.0.0 <2.0.0'
diff --git a/test/packages_handler_test.dart b/test/packages_handler_test.dart
index 1ca031f..75043eb 100644
--- a/test/packages_handler_test.dart
+++ b/test/packages_handler_test.dart
@@ -11,24 +11,24 @@
 import 'package:test/test.dart';
 
 void main() {
-  var dir;
+  String dir;
   setUp(() {
     dir =
         Directory.systemTemp.createTempSync("shelf_packages_handler_test").path;
-    new Directory(dir).createSync();
-    new Directory("$dir/foo").createSync();
-    new File("$dir/foo/foo.dart")
+    Directory(dir).createSync();
+    Directory("$dir/foo").createSync();
+    File("$dir/foo/foo.dart")
         .writeAsStringSync("void main() => print('in foo');");
   });
 
   tearDown(() {
-    new Directory(dir).deleteSync(recursive: true);
+    Directory(dir).deleteSync(recursive: true);
   });
 
   group("packagesHandler", () {
     test("defaults to the current method of package resolution", () async {
       var handler = packagesHandler();
-      var request = new Request(
+      var request = Request(
           "GET",
           Uri.parse("http://example.com/shelf_packages_handler/"
               "shelf_packages_handler.dart"));
@@ -39,13 +39,13 @@
     });
 
     group("with a package root", () {
-      var resolver;
-      setUp(() => resolver = new PackageResolver.root(p.toUri(dir)));
+      PackageResolver resolver;
+      setUp(() => resolver = PackageResolver.root(p.toUri(dir)));
 
       test("looks up a real file", () async {
         var handler = packagesHandler(resolver: resolver);
         var request =
-            new Request("GET", Uri.parse("http://example.com/foo/foo.dart"));
+            Request("GET", Uri.parse("http://example.com/foo/foo.dart"));
         var response = await handler(request);
         expect(response.statusCode, equals(200));
         expect(await response.readAsString(), contains("in foo"));
@@ -54,22 +54,22 @@
       test("404s for a nonexistent file", () async {
         var handler = packagesHandler(resolver: resolver);
         var request =
-            new Request("GET", Uri.parse("http://example.com/foo/bar.dart"));
+            Request("GET", Uri.parse("http://example.com/foo/bar.dart"));
         var response = await handler(request);
         expect(response.statusCode, equals(404));
       });
     });
 
     group("with a package config", () {
-      var resolver;
+      PackageResolver resolver;
       setUp(() {
-        resolver = new PackageResolver.config({"foo": p.toUri("$dir/foo")});
+        resolver = PackageResolver.config({"foo": p.toUri("$dir/foo")});
       });
 
       test("looks up a real file", () async {
         var handler = packagesHandler(resolver: resolver);
         var request =
-            new Request("GET", Uri.parse("http://example.com/foo/foo.dart"));
+            Request("GET", Uri.parse("http://example.com/foo/foo.dart"));
         var response = await handler(request);
         expect(response.statusCode, equals(200));
         expect(await response.readAsString(), contains("in foo"));
@@ -78,7 +78,7 @@
       test("404s for a nonexistent package", () async {
         var handler = packagesHandler(resolver: resolver);
         var request =
-            new Request("GET", Uri.parse("http://example.com/bar/foo.dart"));
+            Request("GET", Uri.parse("http://example.com/bar/foo.dart"));
         var response = await handler(request);
         expect(response.statusCode, equals(404));
       });
@@ -86,7 +86,7 @@
       test("404s for a nonexistent file", () async {
         var handler = packagesHandler(resolver: resolver);
         var request =
-            new Request("GET", Uri.parse("http://example.com/foo/bar.dart"));
+            Request("GET", Uri.parse("http://example.com/foo/bar.dart"));
         var response = await handler(request);
         expect(response.statusCode, equals(404));
       });
@@ -96,7 +96,7 @@
   group("packagesDirHandler", () {
     test("supports a directory at the root of the URL", () async {
       var handler = packagesDirHandler();
-      var request = new Request(
+      var request = Request(
           "GET",
           Uri.parse("http://example.com/packages/shelf_packages_handler/"
               "shelf_packages_handler.dart"));
@@ -108,7 +108,7 @@
 
     test("supports a directory deep in the URL", () async {
       var handler = packagesDirHandler();
-      var request = new Request(
+      var request = Request(
           "GET",
           Uri.parse("http://example.com/foo/bar/very/deep/packages/"
               "shelf_packages_handler/shelf_packages_handler.dart"));
@@ -120,7 +120,7 @@
 
     test("404s for a URL without a packages directory", () async {
       var handler = packagesDirHandler();
-      var request = new Request(
+      var request = Request(
           "GET",
           Uri.parse("http://example.com/shelf_packages_handler/"
               "shelf_packages_handler.dart"));
@@ -130,7 +130,7 @@
 
     test("404s for a non-existent file within a packages directory", () async {
       var handler = packagesDirHandler();
-      var request = new Request(
+      var request = Request(
           "GET",
           Uri.parse("http://example.com/packages/shelf_packages_handler/"
               "non_existent.dart"));