migrate to json_serializable v3
diff --git a/pkgs/pubspec_parse/lib/src/dependency.dart b/pkgs/pubspec_parse/lib/src/dependency.dart
index e2b0770..2d4eda6 100644
--- a/pkgs/pubspec_parse/lib/src/dependency.dart
+++ b/pkgs/pubspec_parse/lib/src/dependency.dart
@@ -128,7 +128,8 @@
   String get _info => 'url@$url';
 }
 
-Uri parseGitUri(String value) => _tryParseScpUri(value) ?? Uri.parse(value);
+Uri parseGitUri(String value) =>
+    value == null ? null : _tryParseScpUri(value) ?? Uri.parse(value);
 
 /// Supports URIs like `[user@]host.xz:path/to/repo.git/`
 /// See https://git-scm.com/docs/git-clone#_git_urls_a_id_urls_a
@@ -217,4 +218,4 @@
 }
 
 VersionConstraint _constraintFromString(String input) =>
-    VersionConstraint.parse(input);
+    input == null ? null : VersionConstraint.parse(input);
diff --git a/pkgs/pubspec_parse/lib/src/dependency.g.dart b/pkgs/pubspec_parse/lib/src/dependency.g.dart
index 243a5b3..534c03a 100644
--- a/pkgs/pubspec_parse/lib/src/dependency.g.dart
+++ b/pkgs/pubspec_parse/lib/src/dependency.g.dart
@@ -11,8 +11,8 @@
     $checkKeys(json,
         requiredKeys: const ['sdk'], disallowNullValues: const ['sdk']);
     final val = SdkDependency($checkedConvert(json, 'sdk', (v) => v as String),
-        version: $checkedConvert(json, 'version',
-            (v) => v == null ? null : _constraintFromString(v as String)));
+        version: $checkedConvert(
+            json, 'version', (v) => _constraintFromString(v as String)));
     return val;
   });
 }
@@ -22,8 +22,7 @@
     $checkKeys(json,
         requiredKeys: const ['url'], disallowNullValues: const ['url']);
     final val = GitDependency(
-        $checkedConvert(
-            json, 'url', (v) => v == null ? null : parseGitUri(v as String)),
+        $checkedConvert(json, 'url', (v) => parseGitUri(v as String)),
         $checkedConvert(json, 'ref', (v) => v as String),
         $checkedConvert(json, 'path', (v) => v as String));
     return val;
@@ -36,8 +35,8 @@
         allowedKeys: const ['version', 'hosted'],
         disallowNullValues: const ['hosted']);
     final val = HostedDependency(
-        version: $checkedConvert(json, 'version',
-            (v) => v == null ? null : _constraintFromString(v as String)),
+        version: $checkedConvert(
+            json, 'version', (v) => _constraintFromString(v as String)),
         hosted: $checkedConvert(json, 'hosted',
             (v) => v == null ? null : HostedDetails.fromJson(v)));
     return val;
@@ -50,10 +49,8 @@
         allowedKeys: const ['name', 'url'],
         requiredKeys: const ['name'],
         disallowNullValues: const ['name', 'url']);
-    final val = HostedDetails(
-        $checkedConvert(json, 'name', (v) => v as String),
-        $checkedConvert(
-            json, 'url', (v) => v == null ? null : parseGitUri(v as String)));
+    final val = HostedDetails($checkedConvert(json, 'name', (v) => v as String),
+        $checkedConvert(json, 'url', (v) => parseGitUri(v as String)));
     return val;
   });
 }
diff --git a/pkgs/pubspec_parse/lib/src/pubspec.dart b/pkgs/pubspec_parse/lib/src/pubspec.dart
index d31e657..7358389 100644
--- a/pkgs/pubspec_parse/lib/src/pubspec.dart
+++ b/pkgs/pubspec_parse/lib/src/pubspec.dart
@@ -2,9 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:checked_yaml/checked_yaml.dart';
 import 'package:json_annotation/json_annotation.dart';
 import 'package:pub_semver/pub_semver.dart';
-import 'package:checked_yaml/checked_yaml.dart';
 
 import 'dependency.dart';
 
@@ -160,10 +160,11 @@
   }
 }
 
-Version _versionFromString(String input) => Version.parse(input);
+Version _versionFromString(String input) =>
+    input == null ? null : Version.parse(input);
 
 Map<String, VersionConstraint> _environmentMap(Map source) =>
-    source.map((k, value) {
+    source?.map((k, value) {
       final key = k as String;
       if (key == 'dart') {
         // github.com/dart-lang/pub/blob/d84173eeb03c3/lib/src/pubspec.dart#L342
diff --git a/pkgs/pubspec_parse/lib/src/pubspec.g.dart b/pkgs/pubspec_parse/lib/src/pubspec.g.dart
index ba7e6eb..d3e18f7 100644
--- a/pkgs/pubspec_parse/lib/src/pubspec.g.dart
+++ b/pkgs/pubspec_parse/lib/src/pubspec.g.dart
@@ -9,14 +9,14 @@
 Pubspec _$PubspecFromJson(Map json) {
   return $checkedNew('Pubspec', json, () {
     final val = Pubspec($checkedConvert(json, 'name', (v) => v as String),
-        version: $checkedConvert(json, 'version',
-            (v) => v == null ? null : _versionFromString(v as String)),
+        version: $checkedConvert(
+            json, 'version', (v) => _versionFromString(v as String)),
         publishTo: $checkedConvert(json, 'publish_to', (v) => v as String),
         author: $checkedConvert(json, 'author', (v) => v as String),
         authors: $checkedConvert(json, 'authors',
             (v) => (v as List)?.map((e) => e as String)?.toList()),
-        environment: $checkedConvert(json, 'environment',
-            (v) => v == null ? null : _environmentMap(v as Map)),
+        environment: $checkedConvert(
+            json, 'environment', (v) => _environmentMap(v as Map)),
         homepage: $checkedConvert(json, 'homepage', (v) => v as String),
         repository: $checkedConvert(json, 'repository',
             (v) => v == null ? null : Uri.parse(v as String)),
diff --git a/pkgs/pubspec_parse/pubspec.yaml b/pkgs/pubspec_parse/pubspec.yaml
index 2ae7fb2..39e627c 100644
--- a/pkgs/pubspec_parse/pubspec.yaml
+++ b/pkgs/pubspec_parse/pubspec.yaml
@@ -19,7 +19,7 @@
 dev_dependencies:
   build_runner: ^1.0.0
   build_verify: ^1.0.0
-  json_serializable: ^2.0.0
+  json_serializable: ^3.0.0
   path: ^1.5.1
   pedantic: ^1.4.0
   stack_trace: ^1.9.2