-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
package_details.dart
47 lines (41 loc) · 1.38 KB
/
package_details.dart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:npm/util/dio.dart';
import 'package:npm/util/extensions.dart';
import 'package:npm/util/format.dart';
import 'package:npm/util/json.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
part 'package_details.g.dart';
part 'package_details.freezed.dart';
@riverpod
Future<PackageDetails> packageDetails(PackageDetailsRef ref,
{required String id}) async {
final response = await ref.watch(dioProvider).getUri<Json>(
Uri.parse('https://registry.npmjs.org/$id'),
);
return PackageDetails.fromJson(response.data!);
}
@freezed
class PackageDetails with _$PackageDetails {
const PackageDetails._();
const factory PackageDetails({
required final String name,
final String? description,
final String? homepage,
final String? repository,
final String? readme,
final List<String>? keywords,
final String? license,
}) = _PackageDetails;
factory PackageDetails.fromJson(Json json) {
final git = json['repository']?['url'] as String?;
return PackageDetails(
name: json['name'],
description: json['description'],
keywords: ListX.fromOrNull<String>(json['keywords']),
license: json['license'],
homepage: json['homepage'],
repository: git == null ? null : Format.urlFromGit(git),
readme: json['readme'],
);
}
}