// GENERATED CODE - DO NOT MODIFY BY HAND

// ignore_for_file: deprecated_member_use_from_same_package, lines_longer_than_80_chars, require_trailing_commas, unnecessary_cast

part of 'pubspec.dart';

// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************

Pubspec _$PubspecFromJson(Map json) => $checkedCreate(
      'Pubspec',
      json,
      ($checkedConvert) {
        final val = Pubspec(
          $checkedConvert('name', (v) => v as String),
          version: $checkedConvert(
              'version', (v) => _versionFromString(v as String?)),
          publishTo: $checkedConvert('publish_to', (v) => v as String?),
          author: $checkedConvert('author', (v) => v as String?),
          authors: $checkedConvert('authors',
              (v) => (v as List<dynamic>?)?.map((e) => e as String).toList()),
          environment:
              $checkedConvert('environment', (v) => _environmentMap(v as Map?)),
          homepage: $checkedConvert('homepage', (v) => v as String?),
          repository: $checkedConvert(
              'repository', (v) => v == null ? null : Uri.parse(v as String)),
          issueTracker: $checkedConvert('issue_tracker',
              (v) => v == null ? null : Uri.parse(v as String)),
          funding: $checkedConvert(
              'funding',
              (v) => (v as List<dynamic>?)
                  ?.map((e) => Uri.parse(e as String))
                  .toList()),
          topics: $checkedConvert('topics',
              (v) => (v as List<dynamic>?)?.map((e) => e as String).toList()),
          ignoredAdvisories: $checkedConvert('ignored_advisories',
              (v) => (v as List<dynamic>?)?.map((e) => e as String).toList()),
          screenshots: $checkedConvert(
              'screenshots', (v) => parseScreenshots(v as List?)),
          documentation: $checkedConvert('documentation', (v) => v as String?),
          description: $checkedConvert('description', (v) => v as String?),
          workspace: $checkedConvert('workspace',
              (v) => (v as List<dynamic>?)?.map((e) => e as String).toList()),
          resolution: $checkedConvert('resolution', (v) => v as String?),
          dependencies:
              $checkedConvert('dependencies', (v) => parseDeps(v as Map?)),
          devDependencies:
              $checkedConvert('dev_dependencies', (v) => parseDeps(v as Map?)),
          dependencyOverrides: $checkedConvert(
              'dependency_overrides', (v) => parseDeps(v as Map?)),
          flutter: $checkedConvert(
              'flutter',
              (v) => (v as Map?)?.map(
                    (k, e) => MapEntry(k as String, e),
                  )),
          executables:
              $checkedConvert('executables', (v) => _executablesMap(v as Map?)),
        );
        return val;
      },
      fieldKeyMap: const {
        'publishTo': 'publish_to',
        'issueTracker': 'issue_tracker',
        'ignoredAdvisories': 'ignored_advisories',
        'devDependencies': 'dev_dependencies',
        'dependencyOverrides': 'dependency_overrides'
      },
    );
