// 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',
  },
);
