[current_results] Update dependencies and lints

- Update dependencies
- Adds dependencies used but missing from pubspec
- Switch to package:lints and make fixes

Change-Id: I6ccbf0bc57b6def2bb49760ecabedb1d51d217d6
Reviewed-on: https://dart-review.googlesource.com/c/dart_ci/+/351820
Reviewed-by: Alexander Thomas <athom@google.com>
Reviewed-by: William Hesse <whesse@google.com>
Auto-Submit: Parker Lougheed <parlough@gmail.com>
diff --git a/current_results/analysis_options.yaml b/current_results/analysis_options.yaml
index a686c1b..572dd23 100644
--- a/current_results/analysis_options.yaml
+++ b/current_results/analysis_options.yaml
@@ -1,14 +1 @@
-# Defines a default set of lint rules enforced for
-# projects at Google. For details and rationale,
-# see https://github.com/dart-lang/pedantic#enabled-lints.
-include: package:pedantic/analysis_options.yaml
-
-# For lint rules and documentation, see http://dart-lang.github.io/linter/lints.
-# Uncomment to specify additional rules.
-# linter:
-#   rules:
-#     - camel_case_types
-
-analyzer:
-#   exclude:
-#     - path/to/excluded/files/**
+include: package:lints/recommended.yaml
diff --git a/current_results/bin/client.dart b/current_results/bin/client.dart
index 7c449c3..52afde8 100644
--- a/current_results/bin/client.dart
+++ b/current_results/bin/client.dart
@@ -22,7 +22,7 @@
   await runner.run(args);
 }
 
-abstract class gRpcCommand extends Command {
+abstract class GrpcCommand extends Command<void> {
   Future<void> runWithClient(QueryClient client);
   @override
   Future<void> run() async {
@@ -41,7 +41,7 @@
   }
 }
 
-class QueryCommand extends gRpcCommand {
+class QueryCommand extends GrpcCommand {
   QueryCommand() {
     argParser.addOption('filter',
         abbr: 'f',
@@ -72,7 +72,7 @@
   }
 }
 
-class ListTestsCommand extends gRpcCommand {
+class ListTestsCommand extends GrpcCommand {
   ListTestsCommand() {
     argParser.addOption('prefix',
         defaultsTo: '', help: 'test name prefix to fetch test names for');
@@ -96,7 +96,7 @@
   }
 }
 
-class FetchCommand extends gRpcCommand {
+class FetchCommand extends GrpcCommand {
   @override
   String get name => 'fetch';
   @override
diff --git a/current_results/bin/server.dart b/current_results/bin/server.dart
index 834e3de..d4d334a 100644
--- a/current_results/bin/server.dart
+++ b/current_results/bin/server.dart
@@ -28,7 +28,9 @@
   final notifications = BucketNotifications();
   await notifications.initialize();
   final current = await loadData(bucket);
-  final grpcServer = Server([QueryService(current, notifications, bucket)]);
+  final grpcServer = Server.create(
+    services: [QueryService(current, notifications, bucket)],
+  );
   await grpcServer.serve(port: port);
   print('Grpc serving on port ${grpcServer.port}');
 }
@@ -48,6 +50,6 @@
     } catch (e, stack) {
       print('Error loading configuration $configurationDirectory: $e\n$stack');
     }
-  }).drain();
+  }).drain<void>();
   return result;
 }
diff --git a/current_results/lib/src/api_impl.dart b/current_results/lib/src/api_impl.dart
index 4b708a8..eba0fc2 100644
--- a/current_results/lib/src/api_impl.dart
+++ b/current_results/lib/src/api_impl.dart
@@ -18,28 +18,28 @@
 
   @override
   Future<GetResultsResponse> getResults(
-          ServiceCall call, GetResultsRequest query) =>
-      Future.value(current.results(query));
+          ServiceCall call, GetResultsRequest request) =>
+      Future.value(current.results(request));
 
   @override
   Future<ListTestsResponse> listTests(
-          ServiceCall call, ListTestsRequest query) =>
-      Future.value(current.listTests(query));
+          ServiceCall call, ListTestsRequest request) =>
+      Future.value(current.listTests(request));
 
   @override
   Future<ListTestsResponse> listTestPathCompletions(
-      ServiceCall call, ListTestsRequest query) async {
+      ServiceCall call, ListTestsRequest request) async {
     throw UnimplementedError();
   }
 
   @override
   Future<ListConfigurationsResponse> listConfigurations(
-      ServiceCall call, ListConfigurationsRequest query) async {
+      ServiceCall call, ListConfigurationsRequest request) async {
     throw UnimplementedError;
   }
 
   @override
-  Future<FetchResponse> fetch(ServiceCall call, Empty _) async {
+  Future<FetchResponse> fetch(ServiceCall call, Empty request) async {
     final response = FetchResponse();
     final messages = await notifications.getMessages();
     final latestObjectPattern = RegExp('^(configuration/main/[^/]+/)latest\$');
diff --git a/current_results/lib/src/slice.dart b/current_results/lib/src/slice.dart
index 9cbc9c4..d3194cc 100644
--- a/current_results/lib/src/slice.dart
+++ b/current_results/lib/src/slice.dart
@@ -67,8 +67,7 @@
   int get size => _size;
 
   void add(List<String> lines) {
-    if (lines.isEmpty) return;
-    var configuration;
+    String? configuration;
     final results = <Result>[];
     for (final line in lines) {
       final result = Result.fromApi(api.Result()
@@ -85,6 +84,9 @@
       _experimentNames.addAll(result.experiments);
       results.add(result);
     }
+    // If there were no results or they were all skips, don't continue.
+    if (configuration == null) return;
+
     final sorted = results.toList()..sort(compareNames);
     _size -= _stored[configuration]?.length ?? 0;
     _stored[configuration] = sorted;
@@ -242,7 +244,7 @@
       Set<String> experimentFilters, PageStart? pageStart,
       {required int needed}) {
     final prefixResult = Result.nameOnly(prefix);
-    var startResult;
+    final Result startResult;
     if (pageStart == null || pageStart.test.compareTo(prefixResult.name) <= 0) {
       startResult = prefixResult;
     } else if (pageStart.test.startsWith(prefixResult.name)) {
diff --git a/current_results/pubspec.lock b/current_results/pubspec.lock
index 75c9355..219111b 100644
--- a/current_results/pubspec.lock
+++ b/current_results/pubspec.lock
@@ -13,28 +13,28 @@
     dependency: transitive
     description:
       name: _fe_analyzer_shared
-      sha256: eb376e9acf6938204f90eb3b1f00b578640d3188b4c8a8ec054f9f479af8d051
+      sha256: "0b2f2bd91ba804e53a61d757b986f89f1f9eaed5b11e4b2f5a2468d86d6c9fc7"
       url: "https://pub.dev"
     source: hosted
-    version: "64.0.0"
+    version: "67.0.0"
   analyzer:
     dependency: transitive
     description:
       name: analyzer
-      sha256: "69f54f967773f6c26c7dcb13e93d7ccee8b17a641689da39e878d5cf13b06893"
+      sha256: "37577842a27e4338429a1cbc32679d508836510b056f1eedf0c8d20e39c1383d"
       url: "https://pub.dev"
     source: hosted
-    version: "6.2.0"
+    version: "6.4.1"
   archive:
     dependency: transitive
     description:
       name: archive
-      sha256: e0902a06f0e00414e4e3438a084580161279f137aeb862274710f29ec10cf01e
+      sha256: "22600aa1e926be775fa5fe7e6894e7fb3df9efda8891c73f70fb3262399a432d"
       url: "https://pub.dev"
     source: hosted
-    version: "3.3.9"
+    version: "3.4.10"
   args:
-    dependency: transitive
+    dependency: "direct main"
     description:
       name: args
       sha256: eef6c46b622e0494a36c5a12d10d77fb4e855501a91c1b9ef9339326e58f0596
@@ -66,7 +66,7 @@
     source: hosted
     version: "1.1.1"
   collection:
-    dependency: transitive
+    dependency: "direct main"
     description:
       name: collection
       sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a
@@ -85,10 +85,10 @@
     dependency: transitive
     description:
       name: coverage
-      sha256: "2fb815080e44a09b85e0f2ca8a820b15053982b2e714b59267719e8a9ff17097"
+      sha256: "8acabb8306b57a409bf4c83522065672ee13179297a6bb0cb9ead73948df7c76"
       url: "https://pub.dev"
     source: hosted
-    version: "1.6.3"
+    version: "1.7.2"
   crypto:
     dependency: transitive
     description:
@@ -106,7 +106,7 @@
     source: hosted
     version: "7.0.0"
   fixnum:
-    dependency: transitive
+    dependency: "direct main"
     description:
       name: fixnum
       sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1"
@@ -125,10 +125,10 @@
     dependency: "direct main"
     description:
       name: gcloud
-      sha256: "94cc7901dba3bcc9cd1c0530caf2d87e733392ce8f93734ccb23d82ef9f2a3e2"
+      sha256: e9501083036d5f94027ce5afddd8ddae9b04121cf2fc6036b2cdd5663b52fca7
       url: "https://pub.dev"
     source: hosted
-    version: "0.8.11"
+    version: "0.8.12"
   glob:
     dependency: transitive
     description:
@@ -141,10 +141,10 @@
     dependency: transitive
     description:
       name: googleapis
-      sha256: c2f311bcd1b3e4052234162edc6b626a9013a7e1385d6aad37e9e6a6c5f89908
+      sha256: "8a8c311723162af077ca73f94b823b97ff68770d966e29614d20baca9fdb490a"
       url: "https://pub.dev"
     source: hosted
-    version: "11.4.0"
+    version: "12.0.0"
   googleapis_auth:
     dependency: "direct main"
     description:
@@ -165,18 +165,18 @@
     dependency: transitive
     description:
       name: http
-      sha256: "759d1a329847dd0f39226c688d3e06a6b8679668e350e2891a6474f8b4bb8525"
+      sha256: a2bbf9d017fcced29139daa8ed2bba4ece450ab222871df93ca9eec6f80c34ba
       url: "https://pub.dev"
     source: hosted
-    version: "1.1.0"
+    version: "1.2.0"
   http2:
     dependency: transitive
     description:
       name: http2
-      sha256: "38db0c4aa9f1cd238a5d2e86aa0cc7cc91c77e0c6c94ba64bbe85e4ff732a952"
+      sha256: "9ced024a160b77aba8fb8674e38f70875e321d319e6f303ec18e87bd5a4b0c1d"
       url: "https://pub.dev"
     source: hosted
-    version: "2.2.0"
+    version: "2.3.0"
   http_multi_server:
     dependency: transitive
     description:
@@ -209,6 +209,14 @@
       url: "https://pub.dev"
     source: hosted
     version: "0.6.7"
+  lints:
+    dependency: "direct dev"
+    description:
+      name: lints
+      sha256: cbf8d4b858bb0134ef3ef87841abdf8d63bfc255c266b7bf6b39daa1085c4290
+      url: "https://pub.dev"
+    source: hosted
+    version: "3.0.0"
   logging:
     dependency: transitive
     description:
@@ -221,26 +229,26 @@
     dependency: transitive
     description:
       name: matcher
-      sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e"
+      sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb
       url: "https://pub.dev"
     source: hosted
-    version: "0.12.16"
+    version: "0.12.16+1"
   meta:
     dependency: transitive
     description:
       name: meta
-      sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e
+      sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136"
       url: "https://pub.dev"
     source: hosted
-    version: "1.10.0"
+    version: "1.12.0"
   mime:
     dependency: transitive
     description:
       name: mime
-      sha256: e4ff8e8564c03f255408decd16e7899da1733852a9110a58fe6d1b817684a63e
+      sha256: "2e123074287cc9fd6c09de8336dae606d1ddb88d9ac47358826db698c176a1f2"
       url: "https://pub.dev"
     source: hosted
-    version: "1.0.4"
+    version: "1.0.5"
   node_preamble:
     dependency: transitive
     description:
@@ -261,26 +269,18 @@
     dependency: transitive
     description:
       name: path
-      sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917"
+      sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af"
       url: "https://pub.dev"
     source: hosted
-    version: "1.8.3"
-  pedantic:
-    dependency: "direct dev"
-    description:
-      name: pedantic
-      sha256: "67fc27ed9639506c856c840ccce7594d0bdcd91bc8d53d6e52359449a1d50602"
-      url: "https://pub.dev"
-    source: hosted
-    version: "1.11.1"
+    version: "1.9.0"
   pointycastle:
     dependency: transitive
     description:
       name: pointycastle
-      sha256: "7c1e5f0d23c9016c5bbd8b1473d0d3fb3fc851b876046039509e18e0c7485f2c"
+      sha256: "43ac87de6e10afabc85c445745a7b799e04de84cebaa4fd7bf55a5e1e9604d29"
       url: "https://pub.dev"
     source: hosted
-    version: "3.7.3"
+    version: "3.7.4"
   pool:
     dependency: "direct main"
     description:
@@ -301,10 +301,10 @@
     dependency: "direct dev"
     description:
       name: protoc_plugin
-      sha256: a800528e47f6efd31a57213dd11b6036f36cbd6677785742a2121e96f7c7a2b9
+      sha256: fb0554851c9eca30bd18405fbbfe81e39166d4a2f0e5b770606fd69da3da0b2f
       url: "https://pub.dev"
     source: hosted
-    version: "21.1.1"
+    version: "21.1.2"
   pub_semver:
     dependency: transitive
     description:
@@ -413,26 +413,26 @@
     dependency: "direct dev"
     description:
       name: test
-      sha256: "9b0dd8e36af4a5b1569029949d50a52cb2a2a2fdaa20cebb96e6603b9ae241f9"
+      sha256: "7ee446762c2c50b3bd4ea96fe13ffac69919352bd3b4b17bac3f3465edc58073"
       url: "https://pub.dev"
     source: hosted
-    version: "1.24.6"
+    version: "1.25.2"
   test_api:
     dependency: transitive
     description:
       name: test_api
-      sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b"
+      sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f"
       url: "https://pub.dev"
     source: hosted
-    version: "0.6.1"
+    version: "0.7.0"
   test_core:
     dependency: transitive
     description:
       name: test_core
-      sha256: "4bef837e56375537055fdbbbf6dd458b1859881f4c7e6da936158f77d61ab265"
+      sha256: "2bc4b4ecddd75309300d8096f781c0e3280ca1ef85beda558d33fcbedc2eead4"
       url: "https://pub.dev"
     source: hosted
-    version: "0.5.6"
+    version: "0.6.0"
   typed_data:
     dependency: transitive
     description:
@@ -445,10 +445,10 @@
     dependency: transitive
     description:
       name: vm_service
-      sha256: c538be99af830f478718b51630ec1b6bee5e74e52c8a802d328d9e71d35d2583
+      sha256: a2662fb1f114f4296cf3f5a50786a2d888268d7776cf681aa17d660ffa23b246
       url: "https://pub.dev"
     source: hosted
-    version: "11.10.0"
+    version: "14.0.0"
   watcher:
     dependency: transitive
     description:
@@ -457,14 +457,22 @@
       url: "https://pub.dev"
     source: hosted
     version: "1.1.0"
+  web:
+    dependency: transitive
+    description:
+      name: web
+      sha256: "4188706108906f002b3a293509234588823c8c979dc83304e229ff400c996b05"
+      url: "https://pub.dev"
+    source: hosted
+    version: "0.4.2"
   web_socket_channel:
     dependency: transitive
     description:
       name: web_socket_channel
-      sha256: d88238e5eac9a42bb43ca4e721edba3c08c6354d4a53063afaa568516217621b
+      sha256: "939ab60734a4f8fa95feacb55804fa278de28bdeef38e616dc08e44a84adea23"
       url: "https://pub.dev"
     source: hosted
-    version: "2.4.0"
+    version: "2.4.3"
   webkit_inspection_protocol:
     dependency: transitive
     description:
@@ -482,4 +490,4 @@
     source: hosted
     version: "3.1.2"
 sdks:
-  dart: ">=3.0.0 <4.0.0"
+  dart: ">=3.2.0 <4.0.0"
diff --git a/current_results/pubspec.yaml b/current_results/pubspec.yaml
index e0db48a..2010309 100644
--- a/current_results/pubspec.yaml
+++ b/current_results/pubspec.yaml
@@ -1,18 +1,22 @@
 name: current_results
-description: Cache and serve the most recent test results from Dart CI
+description: Cache and serve the most recent test results from Dart CI.
+publish_to: none
 
 environment:
-  sdk: '>=2.15.0 <4.0.0'
+  sdk: ^3.2.0
 
 dependencies:
-  shelf: ^1.1.0
-  gcloud: ^0.8.5
-  googleapis_auth: ^1.1.0
+  args: ^2.4.2
+  collection: ^1.18.0
+  fixnum: ^1.1.0
+  gcloud: ^0.8.10
+  googleapis_auth: ^1.4.1
   grpc: ^3.2.4
-  pool: ^1.4.0
+  pool: ^1.5.1
   protobuf: ^3.1.0
+  shelf: ^1.4.0
 
 dev_dependencies:
-  pedantic: ^1.8.0
-  protoc_plugin: ^21.1.1
-  test: ^1.15.0
+  lints: ^3.0.0
+  protoc_plugin: ^21.1.2
+  test: ^1.25.0
diff --git a/current_results/tools/generate_protogen.sh b/current_results/tools/generate_protogen.sh
index 7a6c053..c2bb0cd 100755
--- a/current_results/tools/generate_protogen.sh
+++ b/current_results/tools/generate_protogen.sh
@@ -31,4 +31,4 @@
 
 protoc --dart_out=lib/src/generated ../common/result.proto -I../common
 protoc --dart_out=grpc:lib/src/generated -Ilib/protos -Ithird_party/proto lib/protos/query.proto
-dartfmt -w lib/src/generated/query* lib/src/generated/result*
+dart format lib/src/generated/query* lib/src/generated/result*